Avatar billede rodding Juniormester
09. september 2005 - 11:41 Der er 9 kommentarer og
1 løsning

left join med select - DB2

Kan man ikke have en select i en left join?
ex.

...
...
...
left join tstlib.mbcrrep sp on
sp.craenb = d.adaenb and
sp.craitx = p.itnbr and
sp.crgpcd = c.bfgpcd and
(sp.crazdt = (select sp2.crazdt from amflib.mbcrrep sp2
                  where  sp2.craenb = d.adaenb and
                            sp2.craitx  = p.itnbr and
                            sp2.crgpcd = c.bfgpcd
                            order by sp2.crazdt desc
                            fetch first 1 row only))

Jeg får fejl på "order" i "order by"
Avatar billede rodding Juniormester
09. september 2005 - 11:42 #1
Jeg skal lige sige at select'en virker som "stand alone".
Avatar billede capaj Nybegynder
09. september 2005 - 16:33 #2
Har ikke lige en db2 ved hånden. Men jeg ville tro at enten skulle du:

1) Flytte filter fra from til where:
<EX1>
...
...
...
left join tstlib.mbcrrep sp on
sp.craenb = d.adaenb and
sp.craitx = p.itnbr and
sp.crgpcd = c.bfgpcd
where
(sp.crazdt = (select sp2.crazdt from amflib.mbcrrep sp2
                  where  sp2.craenb = d.adaenb and
                            sp2.craitx  = p.itnbr and
                            sp2.crgpcd = c.bfgpcd
                            order by sp2.crazdt desc
                            fetch first 1 row only))

</EX1>

Eller forsøge dette alternativ:

<EX2>
...
left join tstlib.mbcrrep sp on
sp.craenb = d.adaenb and
sp.craitx = p.itnbr and
sp.crgpcd = c.bfgpcd and
left join
(select sp2.crazdt from amflib.mbcrrep sp2
                  where  sp2.craenb = d.adaenb and
                            sp2.craitx  = p.itnbr and
                            sp2.crgpcd = c.bfgpcd
                            order by sp2.crazdt desc
                            fetch first 1 row only) LJ
on sp.crazdt = Lj.crazdt
</EX1>

/CAPAJ
Avatar billede kjulius Novice
10. september 2005 - 16:30 #3
Jeg ville ændre det til en EXISTS subselect (da du kun tjekker mod 1 row, må det betyde, at du kun ønsker at vide om den eksisterer):

...
...
...
left join tstlib.mbcrrep sp on
sp.craenb = d.adaenb and
sp.craitx = p.itnbr and
sp.crgpcd = c.bfgpcd and
exists (select * from amflib.mbcrrep
                  where  craenb = d.adaenb and
                            craitx  = p.itnbr and
                            crgpcd = c.bfgpcd and
                            crazdt = sp.crazdt)
Avatar billede kjulius Novice
10. september 2005 - 16:41 #4
Nå, jeg har vist glemt noget:

...
...
...
left join tstlib.mbcrrep sp on
sp.craenb = d.adaenb and
sp.craitx = p.itnbr and
sp.crgpcd = c.bfgpcd
Where exists (select * from amflib.mbcrrep
                  where  craenb = d.adaenb and
                            craitx  = p.itnbr and
                            crgpcd = c.bfgpcd and
                            crazdt = sp.crazdt)
Avatar billede kjulius Novice
10. september 2005 - 16:49 #5
Hmm. måske kan du faktisk gøre som i det første forslag (placere en EXIST subselect på en LEFT JOINs ON niveau). Har ikke prøvet det, men det kunne du jo passende gøre for mig :-)
Avatar billede kjulius Novice
10. september 2005 - 17:29 #6
Nej, den første version kan ikke bruges.

Hvis du vil simulere en placering i LEFT JOIN, ku' du jo prøve:

...
...
...
left join tstlib.mbcrrep sp on
sp.craenb = d.adaenb and
sp.craitx = p.itnbr and
sp.crgpcd = c.bfgpcd
Where sp.crazdt is null or exists (select * from amflib.mbcrrep
                  where  craenb = d.adaenb and
                            craitx  = p.itnbr and
                            crgpcd = c.bfgpcd and
                            crazdt = sp.crazdt)

Dermed bliver subselecten kun udført hvis der er fundet en record med LEFT JOIN.
Det burde svare til hvis den blev placeret på LEFT JOINs ON niveau.
Avatar billede rodding Juniormester
12. september 2005 - 11:05 #7
Jeg tror lige jeg må forklare formålet, for jeg får ikke jeres forslag til at virke.

Filen jeg left joiner er en prisliste som indeholder bla.

craenb = d.adaenb and  --------> firma
craitx  = p.itnbr and  --------> varenr.
crgpcd = c.bfgpcd and  --------> prisliste id
crazdt = sp.crazdt)    --------> dato

Der kan jo være flere priser på samme vare men på forskellige datoer alt efter hvornår prisen træder/trådte i kraft.
Så det jeg vil opnå med min left join er at positionere mig på prisen med den seneste ikrafttrædelses dato.

Håber det kaster lys over problemet.
Avatar billede kjulius Novice
12. september 2005 - 12:24 #8
Okay, så blev jeg ledt lidt på afveje, men mon ikke dette kommer tæt på så:

...
...
...
left join tstlib.mbcrrep sp on
sp.craenb = d.adaenb and
sp.craitx = p.itnbr and
sp.crgpcd = c.bfgpcd and
sp.crazdt = (select MIN(crazdt) from amflib.mbcrrep
                  where craenb = d.adaenb and
                            craitx  = p.itnbr and
                            crgpcd = c.bfgpcd and
                            crazdt >= sp.crazdt)
Avatar billede rodding Juniormester
13. september 2005 - 09:48 #9
Med lidt justering kører det nu - tak for hjælpen.

kjulius lægger du et svar.
Avatar billede kjulius Novice
13. september 2005 - 09:52 #10
Okay
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