Avatar billede wheels Nybegynder
05. maj 2009 - 09:48 Der 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)
Avatar billede aaberg Nybegynder
05. maj 2009 - 10:00 #1
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
Avatar billede wheels Nybegynder
05. maj 2009 - 10:10 #2
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.
Avatar billede aaberg Nybegynder
05. maj 2009 - 10:35 #3
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.
Avatar billede wheels Nybegynder
05. maj 2009 - 10:46 #4
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.
Avatar billede wheels Nybegynder
05. maj 2009 - 11:07 #5
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
Avatar billede aaberg Nybegynder
05. maj 2009 - 11:40 #6
sub selecten returnerer altid kun 1 værdi. Du kan ikke afgrænse updaten ud fra dette.

Jeg skulle for øvrigt til at foreslå noget lignende det, du selv er kommet frem til. Godt at du fandt en løsning :-)
Avatar billede wheels Nybegynder
17. september 2009 - 10:45 #7
Tak. nu er det løst
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester