【问题标题】:Any suggestion to fix oracle update statement修复 oracle 更新语句的任何建议
【发布时间】:2021-03-09 14:27:43
【问题描述】:

我正在尝试使用查询的数据结果更新table1.column_name1

Select ID, column_name1 
from table2  
union  
Select ID, column_name2 
from table3

但我收到此错误:

ORA-01427: 单行子查询返回多于一行

请给点建议,谢谢:)

有以下数据表:

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

【问题讨论】:

  • 请提供示例数据、期望的结果以及您想要实现的逻辑的解释。
  • 您没有准确解释“期望”值是如何从“输入”派生的,但我们可以从您的示例中猜到。但是:两个表中的值是否有可能不是null,并且它们不相等?如果那永远不可能(尽管你怎么知道?)那就这么说吧。如果有可能,那么结果应该是什么?在这种内部矛盾的情况下,查找表中的一个是否优先于另一个?然后,还有:如果您的基表中已经有一个非null 值怎么办?即使在这种情况下你也想更新它吗?

标签: sql oracle sql-update inner-join update-statement


【解决方案1】:

您可以使用带有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

【讨论】:

  • 你应该在exists子句中使用t1。(相关子查询)
【解决方案2】:

您正面临问题,因为您试图将两个值(相同/不同)分配给单个值。

你可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多