【问题标题】:Update query runs in SQL Server but not in Oracle更新查询在 SQL Server 中运行,但不在 Oracle 中
【发布时间】:2010-11-04 14:16:45
【问题描述】:
我需要在 SQL Server 和 Oracle 上运行此更新查询。如果重要的话,我们的 Oracle 版本是 10.2。当我在 Oracle 中运行查询时,我得到“错误 ORA-00933:SQL 命令未正确结束”。我需要做什么才能让它在 Oracle 中运行?
UPDATE dbo.tableUpdate
SET fieldA = tt.fieldB
FROM dbo.tableTranslate tt
WHERE
tt.fieldC = dbo.tableUpdate.fieldC
AND
tt.fieldD = dbo.tableUpdate.fieldA
AND
1 = (
SELECT COUNT(tblTrans.fieldD)
FROM dbo.tableTranslate tblTrans
WHERE
tblTrans.fieldC = dbo.tableUpdate.fieldC
AND
tblTrans.fieldD = dbo.tableUpdate.fieldA
)
【问题讨论】:
标签:
sql
sql-server
oracle
ora-00933
【解决方案1】:
UPDATE...FROM 语法对 Oracle 无效。您将需要使用子查询,如下所示:
UPDATE dbo.tableUpdate t
SET t.fieldA = (SELECT tt.fieldB
FROM dbo.tableTranslate tt
WHERE tt.fieldC = t.fieldC
AND tt.fieldD = t.fieldA
)
WHERE 1 = (
SELECT COUNT(tblTrans.fieldD)
FROM dbo.tableTranslate tblTrans
WHERE tblTrans.fieldC = t.fieldC
AND tblTrans.fieldD = t.fieldA
)
【解决方案2】:
Oracle 中的关联子查询语法略有不同。
UPDATE dbo.tableUpdate
SET fieldA = (select tt.fieldB
FROM dbo.tableTranslate tt
WHERE
tt.fieldC = dbo.tableUpdate.fieldC
AND
tt.fieldD = dbo.tableUpdate.fieldA)
AND
1 = (
SELECT COUNT(tblTrans.fieldD)
FROM dbo.tableTranslate tblTrans
WHERE
tblTrans.fieldC = dbo.tableUpdate.fieldC
AND
tblTrans.fieldD = dbo.tableUpdate.fieldA)
【解决方案3】:
您需要完全重写 Oracle 查询。一些在 Oracle 10.2 中不起作用的东西:
-
update 句子中的 from 子句(您需要为此编写子选择)
-
dbo 架构,除非您实际上在 oracle 中有一个名为 dbo 的用户拥有您要更新的表