相关更新获得 "single-row subquery returns more than one row"

Correlated update gets "single-row subquery returns more than one row"

我正在尝试根据 "result_table" table 中的 "a_value" 列更新 table "my_table" 的 "my_value" 列,使用关联更新.当我 运行 类似于以下内容时:

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(在 运行ning 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);

我明白了

"single-row subquery returns more than one row" error.

如何更正查询,使 SELECT 语句每次调用 return 单行?

就这么简单地使用:

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

最好使用 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;

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 有唯一的 constraint/index:

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;