2012-10-12 19 views
5

Ich versuche, ein Feld in einer Tabelle aus einem anderen Feld in einer anderen Tabelle zu aktualisieren.Update 1 Feld in einer Tabelle aus einem anderen Feld in einer anderen Tabelle (OS400, keine 1 zu 1 Beziehung)

Die zu aktualisierende Tabelle enthält mehrere Datensätze, die von 1 Übereinstimmung in der anderen Tabelle aktualisiert werden müssen.

Beispiel, ich habe eine 1 Million Zeilen Umsatz-History-Datei. Diese Millionen Datensätze haben ungefähr 40.000 verschiedene Sku-Codes, jede Zeile hat einen Datums- und Zeitstempel. Jeder SKU enthält mehrere Datensätze.

Ich habe ein neues Feld namens MATCOST (Materialkosten) hinzugefügt.

Ich habe eine zweite Tabelle mit SKU und MATCOST.

Also ich möchte jede Zeile in Tabelle 1 mit dem MATCOST der entsprechenden SKU in Tabelle2 stempeln. Ich kann das scheinbar nicht erreichen, wenn es keine 1: 1-Beziehung ist.

Dies ist, was ich versucht habe:

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

Aber das führt zu der SQL-Fehler: Spalte Qualifier oder Tabelle COSKITSCOG undefiniert und Hervorhebung der q in den letzten Verweis auf queryfiles/coskitscog.Item

Irgendwelche Ideen ?

Mit freundlichen Grüßen

Adam

Update: Das ist, was meine Tabellen wie im Prinzip aussehen. 1 Tabelle enthält die Verkaufsdaten, die andere enthält die MATCOSTS für die verkauften Artikel. Ich muss die Verkaufsdatentabelle (COGTEST2) mit den Daten aus der COSKITCOG-Tabelle aktualisieren. Ich kann eine Koaleszenzanweisung nicht verwenden, da es keine 1: 1-Beziehung ist, die meisten ausgewählten Funktionen, die ich verwende, führen zu dem Fehler von mehreren Auswahlen. Das einzige übereinstimmende Feld ist Item = Item99

Ich finde keine Möglichkeit, mehrere zu vergleichen. Im Beispiel müssten wir 3 SQL-Anweisungen verwenden und nur den Artikelcode angeben. Aber im Leben habe ich etwa 40.000 Artikelcodes und über eine Million Verkaufsdatensätze zu aktualisieren. Wenn SQL es nicht tut, nehme ich an, dass ich versuchen müsste, es in einem RPG-Programm zu schreiben, aber das ist im Moment für mich alles andere als einfach.

Vielen Dank für Ihre Hilfe.

Tables Example

+0

Bietet noch jemand Hilfe an? –

Antwort

2

Qualifizieren Sie die Spalten mit 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

Möglicherweise möchten Sie einen Test im letzten Subselect für 'A.matcost <> C.matcost hinzufügen, da es wenig Sinn macht, Datensätze zu aktualisieren, bei denen sich der Wert nicht ändert. – WarrenT

+0

Vielen Dank für Ihre Antwort @JamesA aber ich bekomme: Ergebnis SELECT mehr als eine Zeile, wenn ich laufe, dass :( –

+0

(SELECT matcost VON QUERYFILES/COSKITSCOG B WHERE A.item99 = B.item) Die where-Klausel hier Dies führt zu mehreren A = B, weil A 1000 Wiederholungen eines Elements haben kann, weil es durch das Datum gesteuert wird.Der Artikel kann an jedem Tag für 5 Jahre verkauft werden.Dies ist, was die COGTEST2-Datei enthält. Riesige Mengen von Umsatzgeschichte. –

0

Von UPDATE, würde ich vorschlagen:

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

Hinweis Beachten Sie die Klammern um matcost.

+0

Hi @Olaf Dietsche es mag die Initiale nicht Komma. Ich bekomme nur: Token, war nicht gültig. Gültige Token: SET. –

+0

dafür bekomme ich Column Qualifier oder Tabelle COSKITSCOG undefined und es hebt den letzten Verweis auf cosmitscog.item hervor –

5

Ok das ist die letzte SQL-Anweisung, die funktioniert. (Es war tatsächlich drei Werte zu aktualisieren)

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

Dieser kompakte Weg, um die gleiche Sache tun soll effizienter sein, nicht wahr?

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) 
Verwandte Themen