Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   verständnisfrage zum JOIN (https://www.delphipraxis.net/151613-verstaendnisfrage-zum-join.html)

p80286 25. Mai 2010 11:26

Datenbank: oracle • Zugriff über: egal

verständnisfrage zum JOIN
 
Hallo zusammen,

ich komme mit der Logik, die hinter den JOINs steckt nicht so ganz klar.
Wenn ich z.B. zwei Tabellen habe
AKTEN
RECHTSANWALT

und ich eine Ausgabe von allen Akten mit zugehörigem (deutschen) Rechtsanwalt (falls er existiert!) haben will, so löse ich das so:

SQL-Code:
select AKTEN.AKTENNR,RECHTSANWALT.NAME
from AKTEN,RECHTSANWALT
where AKTEN.REID=RECHTSANWALT.ID(+)
  and (RECHTSANWALT.LAND='DE' or RECHTSANWALT.LAND is null)

Jetzt gibt es die Möglichkeit einer Akte auch mehrere Ereignisse zuzuordnen. Dies erfolgt über AKTEEREIG und EREIGNIS und zwar im Normalfall so
SQL-Code:
....
where AKTEN.ID=AKTEEREIG.AKTID
  and EREIGNIS.ID=AKTEEREIG.ERGID
Wenn die Frage jetzt lautet, gib mir alle Akten und falls vorhanden das zugehörige Ereignis "Chefeinsicht",
würde ich das jetzt ein UNION lösen.

SQL-Code:
select AKTEN.AKTENR.....
from AKTEN,AKTEREIG,EREIGNIS
where AKTEN.ID=AKTEEREIG.AKTID
  and EREIGNIS.ID=AKTEEREIG.ERGID
  and .....
UNION
select AKTEN.AKTENR.....
from AKTEN
where not exists (select * from AKTEN.ID=AKTEEREIG.AKTID and EREIGNIS.ID=AKTEEREIG.ERGID and EREIGNIS.NAME='Chefeinsicht')
  and .....

Kann man das auch über ein JOIN lösen, ähnlich dem ersten Beispiel?

Gruß
K-H

mkinzler 25. Mai 2010 11:32

Re: verständnisfrage zum JOIN
 
Einfach mit LEFT (OUTER) Join.

spaxxn 25. Mai 2010 12:21

Re: verständnisfrage zum JOIN
 
SQL-Code:
select AKTEN.AKTENNR,RECHTSANWALT.NAME
from AKTEN,RECHTSANWALT
where AKTEN.REID=RECHTSANWALT.ID(+)
  and (RECHTSANWALT.LAND='DE' or RECHTSANWALT.LAND is null)
ob bewusst oder unbewusst, dass hier ist schon ein Oracle-Join, aber nicht ANSI

In Ansi würde dasselbe so aussehen:

SQL-Code:
  select a.AKTENNR
       , r.NAME
    from AKTEN a
    left
    join RECHTSANWALT r
      on r.ID = a.REID
   where (r.LAND='DE' or r.LAND is null)
Bedenke bei Left-Joins, dass das folgendes Query, nicht dasselbe Ergebnis liefert, wie oben
SQL-Code:
  select a.AKTENNR
       , r.NAME
    from AKTEN a
    left
    join RECHTSANWALT r
      on r.ID = a.REID
     and (r.LAND='DE' or r.LAND is null)
Du solltest dir dort genau angucken, welches Ergebnis du erwartest.

p80286 25. Mai 2010 12:29

Re: verständnisfrage zum JOIN
 
@mkinzler
Und wie?

bei

SQL-Code:
where AKTEN.ID=AKTEEREIG.AKTID(+)
  and EREIGNIS.ID(+)=AKTEEREIG.ERGID
werden alle Ereignisse ausgegeben

und bei
SQL-Code:
where AKTEN.ID=AKTEEREIG.AKTID(+)
  and EREIGNIS.ID(+)=AKTEEREIG.ERGID
  and EREIGNIS.NAME='Chefeinsicht'
sowie
SQL-Code:
where AKTEN.ID=AKTEEREIG.AKTID(+)
  and EREIGNIS.ID(+)=AKTEEREIG.ERGID
  and (EREIGNIS.NAME='Chefeinsicht' or EREIGNIS.NAME is null)
kommen nur die Akten heraus, die auch das passende Ereignis haben.
Auf welchem Schlauch stehe ich da gerade?

@spaxxn


Zitat:

Zitat von spaxxn
In Ansi würde dasselbe so aussehen:

SQL-Code:
  select a.AKTENNR
       , r.NAME
    from AKTEN a
    left
    join RECHTSANWALT r
      on r.ID = a.REID
   where (r.LAND='DE' or r.LAND is null)
Bedenke bei Left-Joins, dass das folgendes Query, nicht dasselbe Ergebnis liefert, wie oben
SQL-Code:
  select a.AKTENNR
       , r.NAME
    from AKTEN a
    left
    join RECHTSANWALT r
      on r.ID = a.REID
     and (r.LAND='DE' or r.LAND is null)
Du solltest dir dort genau angucken, welches Ergebnis du erwartest.

auch wenn ich mit den ANSI-JOINS nicht richtig warm werden kann, wo liegt denn da der Unterschied?
(oder meintest Du die Oracle-JOINs? Dann bleibt die Frage immer noch)

Gruß
K-H

spaxxn 25. Mai 2010 12:41

Re: verständnisfrage zum JOIN
 
Ich meinte meine beiden Beispiele.

Allerdings würde es in diesen beiden auch so funktionieren. Habs gerade nochmal nachgeguckt.

Das gibt Probleme, wenn bei mehreren Joins auf, in diesem Fall, Land gejoint wird. Ich suche dazu mal mein altes Problembeispiel raus.

Das trifft hier gar nicht zu. Ich will dir damit nur den Hinweis geben, dass du an der Stelle genau aufpassen solltest. Mich hatte das einmal mehrere Stunden gekostet, da für mich der Fehler nicht offentsichtlich war.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz