在Oracle中使用Join查询进行更新

时间:2011-07-18 13:47:16

标签: sql oracle sql-update oracle10g

查询有什么问题? (它无限期地执行)

UPDATE table1 t1 SET (t1.col,t1.Output) = (
  SELECT t2.col, t3.Output + t2.col
  FROM tabl2 t3 
  LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key
  WHERE t2.col is not NULL);

请帮助我。

2 个答案:

答案 0 :(得分:4)

除非您的SELECT子查询返回单行,否则您的UPDATE语句将失败并显示错误

ORA-01427: single-row subquery returns more than one row

通常,如果您有相关更新,则需要一些条件将外部表T1中的行与内部子查询中的行相关联,以确保子查询返回单个行。这通常看起来像

UPDATE table1 t1 SET (t1.col,t1.Output) = (
  SELECT t2.col, t3.Output + t2.col
  FROM tabl2 t3 
  LEFT JOIN table1 t2 ON t3.Join_Key = t2.Join_Key
  WHERE t2.col is not NULL
    AND t1.some_key = t2.some_key);

最后,这个UPDATE语句正在更新T1中的每一行。这是你想要的吗?或者您只想更新行,例如,您在子查询中找到匹配项?

答案 1 :(得分:2)

对于通用table1,table2和join_key引用,您的查询没有多大意义。

如果这不是您想要的,那么有一些示例数据可以帮助您更好地了解您要查找的结果。

update table1 t1
   set t1.col = (select t2.col
                 from table2 t2
                 where  t1.join_key = t2.join_key(+)  
                  and  t1.col is not null),
       t1.output = (select t2.output + t1.col
                    from  table2 t2
                   where  t1.join_key = t2.join_key(+)  
                     and  t1.col is not null);