![]() |
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:
Wenn die Frage jetzt lautet, gib mir alle Akten und falls vorhanden das zugehörige Ereignis "Chefeinsicht",
....
where AKTEN.ID=AKTEEREIG.AKTID and EREIGNIS.ID=AKTEEREIG.ERGID 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 |
Re: verständnisfrage zum JOIN
Einfach mit LEFT (OUTER) Join.
|
Re: verständnisfrage zum JOIN
SQL-Code:
ob bewusst oder unbewusst, dass hier ist schon ein Oracle-Join, aber nicht ANSI
select AKTEN.AKTENNR,RECHTSANWALT.NAME
from AKTEN,RECHTSANWALT where AKTEN.REID=RECHTSANWALT.ID(+) and (RECHTSANWALT.LAND='DE' or RECHTSANWALT.LAND is null) In Ansi würde dasselbe so aussehen:
SQL-Code:
Bedenke bei Left-Joins, dass das folgendes Query, nicht dasselbe Ergebnis liefert, wie oben
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)
SQL-Code:
Du solltest dir dort genau angucken, welches Ergebnis du erwartest.
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) |
Re: verständnisfrage zum JOIN
@mkinzler
Und wie? bei
SQL-Code:
werden alle Ereignisse ausgegeben
where AKTEN.ID=AKTEEREIG.AKTID(+)
and EREIGNIS.ID(+)=AKTEEREIG.ERGID und bei
SQL-Code:
sowie
where AKTEN.ID=AKTEEREIG.AKTID(+)
and EREIGNIS.ID(+)=AKTEEREIG.ERGID and EREIGNIS.NAME='Chefeinsicht'
SQL-Code:
kommen nur die Akten heraus, die auch das passende Ereignis haben.
where AKTEN.ID=AKTEEREIG.AKTID(+)
and EREIGNIS.ID(+)=AKTEEREIG.ERGID and (EREIGNIS.NAME='Chefeinsicht' or EREIGNIS.NAME is null) Auf welchem Schlauch stehe ich da gerade? @spaxxn Zitat:
(oder meintest Du die Oracle-JOINs? Dann bleibt die Frage immer noch) Gruß K-H |
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 09:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz