AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

verständnisfrage zum JOIN

Ein Thema von p80286 · begonnen am 25. Mai 2010 · letzter Beitrag vom 25. Mai 2010
Antwort Antwort
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#1

verständnisfrage zum JOIN

  Alt 25. Mai 2010, 12:26
Datenbank: oracle • Zugriff über: egal
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='DEor 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: verständnisfrage zum JOIN

  Alt 25. Mai 2010, 12:32
Einfach mit LEFT (OUTER) Join.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#3

Re: verständnisfrage zum JOIN

  Alt 25. Mai 2010, 13:21
SQL-Code:
select AKTEN.AKTENNR,RECHTSANWALT.NAME
from AKTEN,RECHTSANWALT
where AKTEN.REID=RECHTSANWALT.ID(+)
  and (RECHTSANWALT.LAND='DEor 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='DEor 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='DEor r.LAND is null)
Du solltest dir dort genau angucken, welches Ergebnis du erwartest.
"Hey Süße,
hol mir mal was zu trinken! Du wirst schon wieder hässlich!"

Zitat eines Betrunkenen
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#4

Re: verständnisfrage zum JOIN

  Alt 25. Mai 2010, 13:29
@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='Chefeinsichtor EREIGNIS.NAME is null)
kommen nur die Akten heraus, die auch das passende Ereignis haben.
Auf welchem Schlauch stehe ich da gerade?

@spaxxn


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='DEor 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='DEor 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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von spaxxn
spaxxn

Registriert seit: 19. Nov 2004
253 Beiträge
 
Delphi XE2 Enterprise
 
#5

Re: verständnisfrage zum JOIN

  Alt 25. Mai 2010, 13:41
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.
"Hey Süße,
hol mir mal was zu trinken! Du wirst schon wieder hässlich!"

Zitat eines Betrunkenen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 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