如何在Oracle环境(SQL Developer)中使用Sub-Select编写更新语句?
示例:UPDATE表SET列=(SELECT ....)
每次我尝试这个时它都会给我ORA-01427“Sub select返回多行”,即使没有WHERE子句..
答案 0 :(得分:1)
基于对您的问题的理解,我建议使用Merge语句。
Merge into Table1
Using
(SELECT * from table2 where condition) Temp
On (Table1.columname condition Temp.columname)
When matched Then update Set Table1.column_name = Temp.column_name;
Table1是您要更新记录的表。 表2是您要从中获取数据的表(您正在讨论的子查询) 使用此合并语句,您将能够更新n行。
答案 1 :(得分:0)
如果您想要更新多行,可以使用MERGE
语句(如@ jackkds7'上面的答案),也可以在子选择中使用过滤器:
UPDATE table t1
SET column = ( SELECT column FROM table2 t2 WHERE t2.key = t1.key );
如果table2
中table
中的所有记录都没有匹配,那么column
的{{1}}将被设置为NULL
。为避免这种情况,请添加WHERE EXISTS
子句:
UPDATE table t1
SET column = ( SELECT column FROM table2 t2 WHERE t2.key = t1.key )
WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t2.key = t1.key );
哦,如果key
table2
不是唯一的,你可以聚合(由你决定哪个函数最好):
UPDATE table t1
SET column = ( SELECT MAX(column) FROM table2 t2 WHERE t2.key = t1.key )
WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t2.key = t1.key );
希望这有帮助。
答案 2 :(得分:0)
我认为如果您发布实际查询会有所帮助。 实质上,将对将要更新的每一行执行“内部”选择。此内部选择查询称为相关子查询:
UPDATE table t SET t.column = (
select ot.othercolumn from othertable ot
where ot.fk = t.id --This is the correlation part, that finds
--he right value for the row you are currently updating
)
您必须确保您使用的子查询每次运行时始终只返回一行和一列(即,对于每个要更新的行)。如果需要,您可以使用MAX()或ROWNUM来确保始终只获得1个值