我需要编写一个更新语句,该语句使用多个表来确定要更新的行,因为在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语句语法,我找到了以下链接,它显示您可以使用子查询代替表名.
当我尝试写这样的查询时,我得到了一个"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 的声明外键
(通过声明我的意思是存在约束并启用).
我发现将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') )
因此,您的内部查询定义要更新的行.