ORA-01427子查询返回多行.Oracle Update Statement

时间:2018-03-26 16:06:01

标签: sql oracle

如何在Oracle环境(SQL Developer)中使用Sub-Select编写更新语句?

示例:UPDATE表SET列=(SELECT ....)

每次我尝试这个时它都会给我ORA-01427“Sub select返回多行”,即使没有WHERE子句..

3 个答案:

答案 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 );

如果table2table中的所有记录都没有匹配,那么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个值

更多例子: Using Correlated Subqueries