Sql ORA-01427子查询返回多行..Oracle Update语句

Sql ORA-01427子查询返回多行..Oracle Update语句,sql,oracle,Sql,Oracle,如何在Oracle环境SQL开发人员中使用子选择编写update语句 示例:更新表格集列=选择 每次我尝试此方法时,ORA-01427 Sub select都会返回多行,即使没有WHERE子句 基于对您问题的理解,我建议使用合并语句 Merge into Table1 Using (SELECT * from table2 where condition) Temp On (Table1.columname condition Temp.columname) When matched Then

如何在Oracle环境SQL开发人员中使用子选择编写update语句

示例:更新表格集列=选择


每次我尝试此方法时,ORA-01427 Sub select都会返回多行,即使没有WHERE子句

基于对您问题的理解,我建议使用合并语句

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;
表1是要更新记录的表。 表2是您想要从中获取数据的表,即您正在讨论的子查询
使用此merge语句,您将能够更新n行数

如果要更新多行,可以使用上面@jackkds7答案中的MERGE语句,也可以在子选择上使用过滤器:

UPDATE table t1
   SET column = ( SELECT column FROM table2 t2 WHERE t2.key = t1.key );
如果表2中的所有记录都不匹配,则非匹配项的列将设置为NULL。为了避免这种情况,请添加WHERE EXISTS子句:

哦,如果表2中的键不是唯一的,那么您可以汇总到一起,以确定哪个函数最好:

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

希望这能有所帮助。

我认为如果您发布实际查询,会有所帮助。 本质上,将为要更新的每一行执行内部选择。此内部选择查询称为关联子查询:

    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个值

更多示例:

简单,只需确保查询只返回一条记录即可。在此处发布完整查询以获得更好的结果。您不能一次更新多行吗。。?比如说,如果我有100000条记录是1,而我需要它们是0,那么我不能在oracle中通过简单的更新来做到这一点吗?或者我只能更新1行吗?可以。我的意思是,每个被更新的记录都必须生成一个子查询,同时返回一条记录。这里需要一个相关子查询。终于找到了。。谢谢你的帮助!查找相关的子查询并找到一个适用于我当前情况的示例!。。非常感谢,我已经花了将近一个星期的时间在这上面了,但是一直没能弄明白。拿着,读,和。
    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
     )