修复 oracle 更新语句的任何建议

Any suggestion to fix oracle update statement

我正在尝试使用查询

的数据结果更新table1.column_name1
Select ID, column_name1 
from table2  
union  
Select ID, column_name2 
from table3

但我得到这个错误:

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

有什么建议吗,谢谢:)

有以下数据表:

表 1

ID             column_name1            
----------------------------
26                 null          
30                 null                  
34                 null   

表2

ID             column_name1            
---------------------------
26                 fix          
30                 var                  
34                 fix        

表 3

ID             column_name2            
----------------------------
26                 fix          
30                 null                 
34                 fix   

想要的结果:

ID             column_name1            
-----------------------------
26                 fix
30                 var
34                 fix

查询:

UPDATE table1 
SET table1.column_name1 = (SELECT b.column_name1 
                           FROM table1 f 
                           JOIN 
                              (SELECT ID, column_name1 
                               FROM table2  
                               UNION
                               SELECT ID, column_name2 
                               FROM table3) b ON f.ID = b.ID);

您可以使用带有 JOIN 而不是 UNION 的查询,例如为了能够处理空值,这些空值会导致 UPDATE 语句中出现太多行,其中WHERE还需要条件

UPDATE table1 t1
   SET t1.column_name1 = ( SELECT NVL(t3.column_name2, t2.column_name1)
                             FROM table2 t2
                             JOIN table3 t3
                               ON t3.ID = t2.ID
                            WHERE t3.ID = t1.ID )  
 WHERE EXISTS
           ( SELECT *
               FROM table2 t2
               JOIN table3 t3
                 ON t3.ID = t2.ID
              WHERE t3.ID = t1.ID ) 

Demo

您遇到问题是因为您试图将两个值 (same/different) 分配给单个值。

您可以按如下方式使用merge

Merge into table1 t1
Using (SELECT coalesce(t2.column_name1, t3.column_name2) as column_name, t2.id
         FROM table2 t2
         JOIN table3 t3 ON t3.ID = t2.ID) src
ON (src.ID = t1.ID)
When matched then 
Update set t1.column_name1 = src.column_name