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)
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
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.