我需要编写一个更新语句,该语句使用多个表来确定要更新的行,因为在Oracle中,不允许多个表.以下查询将返回"ORA-00971:缺少SET关键字"错误
UPDATE
TABLE1 a,
TABLE2 b
SET
a.COL1 = 'VALUE'
WHERE
a.FK = b.PK
AND b.COL2 IN ('SET OF VALUES')
Run Code Online (Sandbox Code Playgroud)
在oracle上查找UPDATE语句语法,我找到了以下链接,它显示您可以使用子查询代替表名.
当我尝试写这样的查询时,我得到了一个"ORA-01779:无法修改映射到非密钥保留表的列"
UPDATE
(
SELECT
a.COL1
FROM
TABLE1 a,
TABLE2 b
WHERE
a.FK = b.PK
AND b.COL2 IN ('SET OF VALUES')
) update_tbl
SET
update_tbl.COL1 = 'VALUE'
Run Code Online (Sandbox Code Playgroud)
我确实使用EXISTS语句重写了查询(如下所示)并且它工作正常,但仍然想知道如何完成.
UPDATE
TABLE1 update_tbl
SET
update_tbl.COL1 = 'VALUE'
WHERE
EXISTS (
SELECT
1
FROM
TABLE1 a
TABLE2 b
WHERE
a.FK = b.PK
AND b.COL2 IN ('SET OF VALUES')
AND update_tbl.PK = a.PK
)
Run Code Online (Sandbox Code Playgroud)
谢谢!-Nate
另外一个选项:
UPDATE TABLE1 a
SET a.COL1 = 'VALUE'
WHERE a.FK IN
( SELECT b.PK FROM TABLE2 b
WHERE b.COL2 IN ('SET OF VALUES')
)
Run Code Online (Sandbox Code Playgroud)
如果(a)视图包含TABLE1 的声明 PK,则第二个示例将起作用:
UPDATE
(
SELECT
a.COL1, a.PKCOL
FROM
TABLE1 a,
TABLE2 b
WHERE
a.FK = b.PK
AND b.COL2 IN ('SET OF VALUES')
) update_tbl
SET
update_tbl.COL1 = 'VALUE'
Run Code Online (Sandbox Code Playgroud)
......和(b)TABLE1.FK是TABLE2 的声明外键
(通过声明我的意思是存在约束并启用).
我发现将SELECT语句转换为UPDATE的一种很好,快速,一致的方法是根据ROWID进行更新.
UPDATE
TABLE1
SET
COL1 = 'VALUE'
WHERE
ROWID in
(
SELECT
a.rowid
FROM
TABLE1 a,
TABLE2 b
WHERE
a.FK = b.PK
AND b.COL2 IN ('SET OF VALUES')
)
Run Code Online (Sandbox Code Playgroud)
因此,您的内部查询定义要更新的行.
归档时间: |
|
查看次数: |
89254 次 |
最近记录: |