09. september 2005 - 11:41Der 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))
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>
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)
... ... ... 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)
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 :-)
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.
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.
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)
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.