2012-10-12 7 views
5

Sto tentando di aggiornare un campo in una tabella da un altro campo in una tabella diversa.Aggiorna il campo 1 in una tabella da un altro campo in una tabella diversa (OS400, non una relazione 1 a 1)

La tabella che si aggiorna avrà più record che richiedono l'aggiornamento da 1 corrispondenza nell'altra tabella.

Esempio, ho un file di cronologia vendite di 1 milione di righe. Quei milioni di dischi hanno approssimativamente 40.000 codici sku diversi, ogni riga ha un timbro data e ora. Ogni sku avrà più record in là.

Ho aggiunto un nuovo campo chiamato MATCOST (costo del materiale).

Ho una seconda tabella contenente SKU e MATCOST.

Quindi voglio timbrare ogni riga nella tabella 1 con il MATCOST corrispondente della tabella in tabella2. Non riesco a raggiungere questo risultato quando non è una relazione 1 a 1.

questo è quello che provato:

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

Ma che genera l'errore SQL: Qualificatore colonna o tavolo COSKITSCOG indefinito ed evidenziando il q nell'ultima riferimento alla queryfiles/coskitscog.Item

Qualche idea ?

Cordiali saluti

Adam

Update: Questo è ciò che i miei tavoli sembrano in linea di principio. 1 Tabella contiene i dati di vendita, l'altro contiene MATCOSTS per gli articoli venduti. Devo aggiornare la tabella dei dati di vendita (COGTEST2) con i dati della tabella COSKITCOG. Non riesco a usare un'istruzione di coalescenza perché non è una relazione 1 a 1, la maggior parte delle funzioni selezionate che uso risultano nell'errore di selezioni multiple. L'unico campo corrispondente è Articolo = Articolo

Non riesco a trovare un modo per abbinare multipli. Nell'esempio dovremmo usare 3 istruzioni SQL e solo specificare il codice articolo. Ma in diretta ho circa 40.000 codici articolo e oltre un milione di record di dati di vendita da aggiornare. Se SQL non lo farà, suppongo che dovrei provare a scriverlo in un programma RPG, ma per il momento è molto al di là di me.

Grazie per l'aiuto che puoi fornire.

Tables Example

+0

Qualcun altro offre assistenza? –

risposta

2

qualificare il colonne 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

Si consiglia di aggiungere un test nell'ultima sottoselezione per 'A.matcost <> C.matcost', poiché non ha molto senso aggiornare i record in cui il valore non cambierà. – WarrenT

+0

Grazie per la risposta @JamesA ma ottengo: Risultato di SELEZIONA più di una riga quando ho eseguito che :( –

+0

(SELECT matcost DA QUERYFILES/COSKITSCOG B DOVE A.item99 = B.item) La clausola where qui risulterà in più A = B perché A potrebbe avere 1000 ripetizioni di un articolo perché è basato sulla data. L'articolo può essere venduto ogni giorno per 5 anni.Questo è il contenuto del file COGTEST2.Un enorme quantità di cronologia vendite –

0

Da UPDATE, suggerirei:

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 le parentesi intorno matcost.

+0

Ciao @Olaf Dietsche non mi piace l'iniziale virgola. Ho appena ricevuto: Token, non era valido. Token validi: SET. –

+0

per questo ottengo un qualificatore di colonna o una tabella COSKITSCOG indefinito ed evidenzia l'ultimo riferimento a coskitscog.item –

5

Ok questa è l'ultima istruzione SQL che ha funzionato. (c'erano in realtà 3 valori da aggiornare)

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

Questo modo più compatto per fare la stessa cosa dovrebbe essere più efficiente, 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)