2012-10-12 28 views
5

Próbuję zaktualizować pole w tabeli z innego pola w innej tabeli.Zaktualizuj 1 pole w tabeli z innego pola w innej tabeli (OS400, a nie relacji 1 do 1)

Zaktualizowana tabela będzie zawierała wiele rekordów, które wymagają aktualizacji od 1 dopasowania w drugiej tabeli.

Przykład, mam plik historii sprzedaży o wartości 1 miliona wierszy. Te miliony rekordów mają około 40 000 różnych kodów sku, każdy wiersz ma datę i godzinę. Każdy sku będzie miał tam wiele rekordów.

Dodałem nowe pole o nazwie MATCOST (koszt materiałowy).

Mam drugą tabelę zawierającą SKU i MATCOST.

Więc chcę pieczęć każdego wiersza w tabeli 1 z odpowiednim MATCOST SKU w table2. Nie mogę tego osiągnąć, gdy nie ma związku 1 do 1.

To co próbowałem:

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

Ale to prowadzi do błędu SQL: kwalifikator kolumny lub tabeli COSKITSCOG niezdefiniowane i podkreślając q w odniesieniu do ostatniego queryfiles/coskitscog.Item

Jakieś pomysły ?

poważaniem

Adam

Aktualizacja: To jest to, co moi stoły wyglądają w zasadzie. 1 Tabela zawiera dane sprzedaży, druga zawiera MATCOSTS dla sprzedanych produktów. Muszę zaktualizować tabelę danych sprzedaży (COGTEST2) danymi z tabeli COSKITCOG. Nie mogę użyć instrukcji koalescencji, ponieważ nie jest to relacja 1 do 1, większość wybranych funkcji powoduje błąd wielu wyborów. Jedynym pasującym polem jest Item = Item99

Nie mogę znaleźć sposobu na dopasowanie wielu. W tym przykładzie będziemy musieli użyć 3 instrukcji SQL i po prostu podać kod przedmiotu. Ale na żywo mam około 40 000 kodów pozycji i ponad milion rekordów danych sprzedaży do aktualizacji. Jeśli SQL tego nie zrobi, przypuszczam, że musiałbym spróbować napisać to w programie RPG, ale to na razie poza mną.

Dziękujemy za pomoc.

Tables Example

+0

Ktoś jeszcze oferuje pomoc? –

Odpowiedz

2

zakwalifikować kolumny z 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

Możesz dodać test w ostatniej podsekcji dla 'A.matcost <> C.matcost', ponieważ nie ma sensu aktualizować rekordów, w których wartość się nie zmieni. – WarrenT

+0

Dzięki za odpowiedź @JamesA ale dostaję: Wynik wybrać więcej niż jeden wiersz, gdy biegnę że :( –

+0

(SELECT matcost OD QUERYFILES/COSKITSCOG B GDZIE A.item99 = B.item) klauzuli WHERE tutaj spowoduje, że A = B będzie miał wiele powtórzeń, ponieważ A może mieć 1000 powtórzeń danego Przedmiotu, ponieważ jest on prowadzony według daty, a przedmiot może być sprzedawany każdego dnia przez 5 lat .To jest plik COGTEST2 Ogromne ilości historii sprzedaży –

0

Od UPDATE, sugeruję:

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

zanotować szelki około matcost.

+0

Witam @Olaf Dietsche to nie lubi początkowej przecinek: dostaję: token, nie jest ważny, ważne to: SET. –

+0

za to dostaję kwalifikator kolumny lub tabelę COSKITSCOG niezdefiniowane i podświetla to ostatnie odniesienie do coskitscog.item –

5

Ok to jest ostatnie polecenie SQL, które zadziałało. (w rzeczywistości były 3 wartości do zaktualizowania)

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

Ten bardziej kompaktowy sposób robienia tego samego powinien być bardziej wydajny, co?

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)