Estoy tratando de actualizar la columna "my_value" de la tabla "my_table" en función de la columna "a_value" en la tabla "result_table", utilizando la actualización correlacionada. Cuando ejecuto algo similar a lo siguiente:

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 (después de ejecutar la consulta UPDATE) debería convertirse en:

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

Mi declaración de actualización:

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

Entiendo

Error de "subconsulta de una sola fila devuelve más de una fila".

¿Cómo se puede corregir la consulta para que la instrucción SELECT devuelva una sola fila para cada llamada?

0
Matin 23 ene. 2018 a las 12:34

3 respuestas

La mejor respuesta

Lo mejor es usar 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;
1
XING 23 ene. 2018 a las 10:15

Solo usa tan fácil como esto:

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 

Ya tienes OrderID s únicos. Entonces, no hay problema.

D e m o

1
Barbaros Özhan 23 ene. 2018 a las 10:43

La solución MERGE es probablemente la mejor, pero solo para el registro su UPDATE tenía algunas combinaciones adicionales que probablemente fueron la causa del error. Asumiendo que result_table.orderid es único, parece que todo lo que necesitabas era:

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

O si result_table.orderid tiene una restricción / índice único:

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;
1
William Robertson 23 ene. 2018 a las 16:50