2012-10-12 62 views
5

Im tratando de actualizar un campo en una tabla desde otro campo en una tabla diferente.Actualizar campo 1 en una tabla de otro campo en una tabla diferente (OS400, no una relación 1 a 1)

La tabla que se está actualizando tendrá varios registros que necesitan actualización de 1 coincidencia en la otra tabla.

Ejemplo, tengo un archivo de historial de ventas de 1 millón de filas. Esos millones de registros tienen aproximadamente 40,000 códigos sku diferentes, cada fila tiene un sello de fecha y hora. Cada sku tendrá múltiples registros allí.

Agregué un nuevo campo llamado MATCOST (costo del material).

Tengo una segunda tabla que contiene SKU y el MATCOST.

Así que quiero sellar cada línea en la tabla 1 con el MATCOST del SKU correspondiente en la tabla2. No puedo lograr esto cuando no es una relación de 1 a 1.

Esto es lo que he intentado:

update 
    aulsprx3/cogtest2 
set 
    matcost = (select Matcost from queryfiles/coskitscog where 
    aulsprx3/cogtest2.item99 = queryfiles/coskitscog.ITEM) 
where 
    aulsprx3/cogtest2.item99=queryfiles/coskitscog.ITEM 

Pero que produce el error SQL: calificador columna o tabla COSKITSCOG indefinido y destacando la q en la última referencia a queryfiles/coskitscog.Item

Algunas ideas ?

cordiales Saludos

Adam

Actualización: Esto es lo que mis cuadros se parecen en principio. 1 La tabla contiene los datos de ventas, la otra contiene los MATCOSTS para los artículos que se vendieron. Necesito actualizar la tabla de datos de ventas (COGTEST2) con los datos de la tabla COSKITCOG. No puedo usar una declaración de coalescencia porque no es una relación de 1 a 1, la mayoría de las funciones de selección que uso dan como resultado el error de múltiples selecciones. El único campo coincidente es Item = Item99

No encuentro la manera de hacer coincidir múltiples. En el ejemplo, tendríamos que usar 3 instrucciones SQL y simplemente especificar el código del elemento. Pero en vivo tengo alrededor de 40,000 códigos de artículos y más de un millón de registros de datos de ventas para actualizar. Si SQL no lo hace, supongo que tendré que intentar escribirlo en un programa de rol, pero eso está muy lejos de mí por el momento.

Gracias por cualquier ayuda que pueda proporcionar.

Tables Example

+0

¿Alguien más ofrece alguna ayuda? –

Respuesta

2

califique las columnas con correlation names.

UPDATE AULSPRX3/COGTEST2 A 
    SET A.matcost = (SELECT matcost 
         FROM QUERYFILES/COSKITSCOG B 
         WHERE A.item99 = B.item) 
    WHERE EXISTS(SELECT * 
        FROM QUERYFILES/COSKITSCOG C 
        WHERE A.item99 = C.item) 
+0

Es posible que desee agregar una prueba en la última subselección para 'A.matcost <> C.matcost', ya que tiene poco sentido actualizar los registros donde el valor no cambiará. – WarrenT

+0

Gracias por su respuesta @JamesA pero me sale: Resultado de seleccionar más de una fila cuando corro que :( –

+0

(seleccione matcost DE QUERYFILES/COSKITSCOG B DONDE A.item99 = B.item) La cláusula where aquí resultará en múltiples A = B porque A puede tener 1000 repeticiones de un artículo porque su fecha de vencimiento es.El artículo se puede vender todos los días durante 5 años.Esto es lo que contiene el archivo COGTEST2. Grandes cantidades de historial de ventas. –

0

De UPDATE, sugeriría:

update 
    aulsprx3/cogtest2 
set 
    (matcost) = (select Matcost from queryfiles/coskitscog where 
       aulsprx3/cogtest2.item99 = queryfiles/coskitscog.ITEM) 
where 
    aulsprx3/cogtest2.item99=queryfiles/coskitscog.ITEM 

nota de las llaves de todo matcost.

+0

Hola @Olaf Dietsche no le gusta la inicial comma. Acabo de recibir: Token, no era válido. Tokens válidos: SET. –

+0

para esto obtengo Calificador de columna o tabla COSKITSCOG indefinido y resalta la última referencia a coskitscog.item –

5

Bien, esta es la sentencia SQL final que funcionó. (en realidad hay 3 valores para actualizar)

UPDATE atst2f2/SAP20 ct         
     SET VAL520 = (SELECT cs.MATCOST      
        FROM queryfiles/coskitscog cs   
        WHERE cs.ITEM = ct.pnum20), 
      VAL620 = (SELECT cs.LABCOST      
        FROM queryfiles/coskitscog cs   
        WHERE cs.ITEM = ct.pnum20), 
      VAL720 = (SELECT cs.OVRCOST      
        FROM queryfiles/coskitscog cs   
        WHERE cs.ITEM = ct.pnum20),    
     WHERE ct.pnum20 IN (SELECT cs.ITEM      
         FROM queryfiles/coskitscog cs) 
2

Esta forma más compacta de hacer lo mismo debería ser más eficiente, ¿eh?

UPDATE atst2f2/SAP20 ct         
    SET (VAL520, VAL620, VAL720) = 
     (SELECT cs.MATCOST, cs.LABCOST, cs.OVRCOST      
       FROM queryfiles/coskitscog cs   
       WHERE cs.ITEM = ct.pnum20)    
    WHERE ct.pnum20 IN (SELECT cs.ITEM      
        FROM queryfiles/coskitscog cs) 
Cuestiones relacionadas