相关更新得到"单行子查询返回多行"

时间:2018-01-23 09:34:12

标签: oracle correlated-subquery

我正在尝试更新" my_value"表格列#34; my_table"基于" a_value"列" result_table"表,使用相关更新。当我运行类似于以下的东西时:

my_table:

OrderID  my_volume my_value  
----------------------------
1         100        NULL
2          50        NULL

result_table: 

OrderID  a_value   a_type  
----------------------------
1         2000      BUY
2         3500      SELL

My_table(运行UPDATE查询后)应该变为:

OrderID  my_volume my_value  
----------------------------
1         100        2000
2          50        3500

我的更新声明:

update my_table set 
my_value=
(select a_value 
from result_table
join my_table on 
result_table.orderID = my_table.orderID )
where orderID in
(select my_table.orderID from my_table,result_table
where
result_table.orderID = my_table.orderID);

我得到了

  

"单行子查询返回多行"错误。

如何更正查询,以便SELECT语句为每个调用返回单行?

3 个答案:

答案 0 :(得分:1)

使用就像这样简单:

update my_table v set v.my_value = ( select a_value from result_table r where r.OrderID = v.OrderID );

select * from my_table;
ORDERID MY_VOLUME   MY_VALUE
------- ---------   --------
1          100        2000
2           50        3500 

您已经拥有唯一的OrderID。所以,没有问题。

D e m o

答案 1 :(得分:1)

最好使用MERGE

Merge into my_table mytab
using result_table  rsltab
 on (mytab.id = rsltab.id)

When matched then
update
SET mytab.my_value = rsltab.a_value;

答案 2 :(得分:1)

MERGE解决方案可能是最好的,但只是为了记录你的UPDATE中有一些额外的连接可能是导致错误的原因。假设result_table.orderid是唯一的,看起来你需要的只是:

update my_table
set    my_column =
       ( select my_value
         from   result_table
         where  result_table.orderid = my_table.orderid )
where  orderid in
       ( select orderid
         from   result_table );

result_table.orderid是否有唯一约束/索引:

update ( select t.my_column, r.my_value
         from   my_table t
                join result_table r on r.orderid = t.orderid )
set my_column = my_value;