tipos tablas optimizar lentas left inner ejemplos consultas sql join db2 ibm-midrange

sql - tablas - Actualizando una tabla usando JOIN



tipos de join mysql (4)

Intento redactar una declaración SQL pero sigo recibiendo errores ...

Aquí está mi situación:

Tengo una tabla con órdenes de venta y una tabla con transferencias de artículos.

Las órdenes de venta tienen un número de pedido y una extensión, donde la identificación en sí misma puede no ser única, pero la combinación de número de orden y extensión es. La extensión puede ser nula.

La tabla de transferencia de artículos tiene un número de referencia y a veces un número de orden de venta más extensión, pero no siempre.

La razón es que a veces los artículos se transfieren para un pedido de cliente, a veces por otros motivos. Además, una orden de venta puede ocurrir sin que el artículo se transfiera primero. Sin embargo, una orden solo puede tener una transferencia, y viceversa.

Agregué un campo "transref" a la tabla de orden de venta para que se pueda conectar una orden a una transferencia, si corresponde. (Esta información no se puede calcular sobre la marcha por motivos de rendimiento.) Así que mis tablas ahora se ven así (en realidad son más grandes, pero esta es la información importante):

SALESORDERS ORDERNO ORDEXT TRANSREF 1 (null) (null) 2 (null) (null) 2 a (null) 3 (null) (null) TRANSFERS TRANSREF ORDERNO ORDEXT t1 1 (null) t2 (null) (null) t3 2 a

Ahora necesito obtener el código transref en la tabla de órdenes de venta para que se vea así:

SALESORDERS ORDERNO ORDEXT TRANSREF 1 (null) t1 2 (null) (null) 2 a t3 3 (null) (null)

Intenté todo tipo de declaraciones, por ejemplo

UPDATE SALESORDERS INNER JOIN TRANSFERS ON SALESORDERS.ORDERNO = TRANSFERS.ORDERNO and (SALESORDERS.ORDEXT = TRANSFERS.ORDEXT or (SALESORDERS.ORDEXT is null and TRANSFERS.ORDEXT is null)) SET SALESORDERS.TRANSREF = TRANSFERS.TRANSREF WHERE TRANSFERS.ORDERNO IS NOT NULL

pero nada funcionó hasta ahora. ¿Alguien puede ayudarme a desatar el nudo que tengo en mi cerebro después de probar una docena de tutoriales y respuestas para esto?


Como lo ha llamado AS / 400 varias veces, supongo que está en una versión anterior del sistema operativo. Probablemente quieras una subselección correlacionada. Algo como:

update salesorders o set transref = (select t.transref from transfers t where o.orderno = t.orderno and (o.ordext = t.ordext or (t.ordext=null and o.ordext=null)) and t.transref <> null) where ordext = null;


Está teniendo este problema porque DB2 no le permite utilizar un JOIN con una simple instrucción UPDATE (una de sus muchas restricciones aparentemente arbitrarias).

La mejor forma de hacerlo en DB2 es usar MERGE . Algo como esto debería funcionar:

merge into salesorders using transfers on transfers.orderno = salesorders.orderno and ( transfers.ordtext = salesorders.ordtext or ( transfers.ordtext is null and salesorders.ordtext is null ) ) when matched then update set salesorders.transref = transfers.transref;


La sintaxis para esto depende completamente de su variedad de SQL

Por ejemplo, esto puede funcionar (SQL Server)

UPDATE SALESORDERS SET SALESORDERS.TRANSREF = TRANSFERS.TRANSREF FROM SALESORDERS INNER JOIN TRANSFERS ON SALESORDERS.ORDERNO = TRANSFERS.ORDERNO and (SALESORDERS.ORDEXT = TRANSFERS.ORDEXT or (SALESORDERS.ORDEXT is null and TRANSFERS.ORDEXT is null)) WHERE TRANSFERS.ORDERNO IS NOT NULL


MERGE funciona bien, ya sea integrado en SQLRPGLE o con STRSQL interactivo.