我需要编写一个使用多个表来确定要更新哪些行的更新语句,因为在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')
查看oracle上的UPDATE语句语法,我发现以下link,这表明您可以使用一个子查询代替一个表名.
当我试图写这样的查询时,我得到一个“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'
我使用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 )
谢谢!
-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') )
如果(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'
…和(b)TABLE1.FK是TABLE2的声明的外键
(通过声明我的意思是约束存在并被启用).