05. maj 2009 - 09:48Der er
6 kommentarer og 1 løsning
SQL Update på iSeries
Følgende SQL opdaterer samtlige rækker i en fil. Jeg forventede at WHERE-clausen satte en begrænsning. Men det gør den ikke. Nogen der har et godt forslag ? UPDATE bjarne/mbmtest A SET a.bopno = coalesce( (SELECT b.ropno FROM bjarne/BOMCHLDRO1 b where a.bprod=B.bprod and a.bmwhs=b.bmwhs and a.bmbomm=b.bmbomm and a.bchld=b.bchld and a.bseq=b.bseq), 0)
Din WHERE-clause er på sub-querien. For at sætte begrænsning på, hvilke rows der skal opdateres, skal WHERE-clausen være på UPDATE sætningen.
UPDATE bjarne/mbmtest A SET a.bopno = coalesce( (SELECT b.ropno FROM bjarne/BOMCHLDRO1 b where a.bprod=B.bprod and a.bmwhs=b.bmwhs and a.bmbomm=b.bmbomm and a.bchld=b.bchld and a.bseq=b.bseq), 0) WHERE et-eller-andet
Okay. Så flytter jeg WHERE-clausen væk fra sub-queryen og prøver følgende:
UPDATE bjarne/mbmtest A SET a.bopno = coalesce( (SELECT b.ropno FROM bjarne/BOMCHLDRO1 b), 0) where a.bprod=b.bprod and a.bmwhs=b.bmwhs and a.bmbomm=b.bmbomm and a.bchld=b.bchld and a.bseq=b.bseq
men får nu at vide at: Column qualifier or table B undefined.
Du kan ikke bruge værdier fra din subquery, uden for subqueryen. Din subquery bliver kørt for hver row som skal opdateres, derfor giver det ikke mening at bruge den i UPDATE sætningens WHERE-clause.
Prøv at forklare med ord, hvad det er du prøver at opnå, så skal jeg se om jeg kan give et mere specifikt forslag til en løsning.
OK - jeg prøver. Feltet ROPNO fra filen BJARNE/BOMCHLDRO1 skal placeres i feltet BOPNO i filen BJARNE/MBMTEST, hvis følgende felter i begge filer er ens: BMWHS og BMBOMM og BCHLD og BSEQ. Dvs. at de sidst nævnte 4 felter findes i begge filer. Håber du forstår.
Jeg tror jeg har fået det til at virke med følgende SQL: UPDATE bjarne/mbmtest A SET a.bopno = coalesce( (SELECT b.ropno FROM bjarne/BOMCHLDRO1 b where a.bprod=B.bprod and a.bmwhs=b.bmwhs and a.bmbomm=b.bmbomm and a.bchld=b.bchld and a.bseq=b.bseq), 0) where exists (select ropno from bjarne/bomchldro1 where a.bprod=bprod and a.bmwhs=bmwhs and a.bmbomm=bmbomm and a.bchld=bchld and a.bseq=bseq)
Jeg kan bare ikke forstå hvorfor det er nødvendigt at afgrænsningen i SUB-selecten samt i EXIST-clausen
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.