Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage von 3 Tabellen mit 2x Left Join.... Geht das? (https://www.delphipraxis.net/167575-abfrage-von-3-tabellen-mit-2x-left-join-geht-das.html)

juergen 6. Apr 2012 13:24

Datenbank: Pervasive • Version: 11 • Zugriff über: PDAC

Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Hallo zusammen,

ich muss 3 Tabellen abfragen, wo mir einfach die Erfahrung/ Wissen fehlt wie ich das ausführen muss.

Tabellenaufbau:

Adresstamm (Master, Tabellenname = AA)
Kontaktpersonen (Detail, Tabellenname = A2)
Wartungsvertrag (Detail, Tabellenname = R6)

Zu jedem Adresstamm *kann* es eine oder mehrere Kontaktpersonendatensätze geben. Bis hierhin kein Problem!


Delphi-Quellcode:
Select A.xxx, P.xxx from AdressStamm as A left JOIN Kontaktpersonen as P on P.DBAA_RECID = A.Identifikation


Für die dritte Tabelle gilt auch: Zu jedem Adresstamm *kann* es eine oder mehrere Wartungsvertragsdatensätze geben.

Und genau da hänge ich. Ich hatte mir gedacht ich hänge da einfach noch ein Left Join dran genau wie bei den ersten beiden Tabellen:

Delphi-Quellcode:
Select A.xxx, P.xxx, W.xxx from AdressStamm as A left JOIN Kontaktpersonen as P on P.DBAA_RECID = A.Identifikation,
AdressStamm left JOIN Wartungsvertrag as W on W.DBAA_RECID = AdressStamm.Identifikation
Es erscheint kein Fehler aber die Abfrage rennt seit Stunden.... :gruebel:
Die "DBAA_RECID"-Felder sind jeweils Keys.

Weiß jemand in welche Richtung ich meine Unwissenheit erweitern muss? Darf/sollte man 2 Left Join Abfragen nicht anwenden, bzw. wie löst man dann solch eine Anforderung?

Vielen Dank schon mal im Voraus!

mkinzler 6. Apr 2012 13:27

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Man kann das schon machen, da es sich aber um 2 verschiedene Dinge handelt ( Kontaktpersonen, Wartungsverträge) ist die Frage, wie soll das Ergebnis aussehen?

DeddyH 6. Apr 2012 13:33

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Wenn ich das richtig sehe, joinst Du Adressstamm noch einmal dazu, das dürfte dann einen CROSS JOIN ergeben, was natürlich unheimlich aufhält und nichts bringt. Ich denke, Du meinst das etwa so:
SQL-Code:
SELECT
  A.xxx, P.xxx, W.xxx
FROM
  AdressStamm AS A
LEFT JOIN
  Kontaktpersonen AS P ON P.DBAA_RECID = A.Identifikation
LEFT JOIN
  Wartungsvertrag AS W ON W.DBAA_RECID = A.Identifikation
[edit] Außerdem siehe Markus' Einwand, ich habe mich auch bereits gefragt, was das werden soll. [/edit]

juergen 6. Apr 2012 13:48

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Hallo, :hi:

ich möchte zu jedem Adresstamm jeweils *alle* Kontaktpersonen und jeweils *alle* Wartungsverträge als Ergebnis haben, natürlich nur die, welche auch zu dem jeweiligen Adresstamm gehören. Es kann sein, dass es keine Wartungsverträge zu *jedem* Adresstamm gibt. Auch bei den Kontaktpersonen kann es sein, dass es keinen Datensatz zu *jedem* Adresstamm gibt.
Dann müssen trotzdem *alle* Adresstamm-Datensätze ausgewiesen werden.

Aus diesem Grunde hatte ich mir Left Join rausgesucht.

Edit @DeddyH:
Auf die Schnelle scheint es zu funktionieren. Ich muss das im Detail noch prüfen.
Vielen Dank für eure wirklich schnelle Hilfestellung und noch einen schönen Feiertag! :thumb:

mkinzler 6. Apr 2012 13:56

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Dann würde ich das als Bedingung angeben

SQL-Code:
select
    <Feldliste>
from
    Adressstamm a
where
    exists ( select DBAA_RECID from Kontaktperson p where p.DBAA_RECID = a.Identifikation union select DBAA_RECID from Wartungsvertrag w where w.DBAA_RECID = a.Identifikation);

Nach nochmaligen Lesen des vorigen Beitrages, habe ich gesehe, dass ich ihn falsch verstanden habe

DeddyH 6. Apr 2012 13:58

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Ist das dann nicht ein INNER JOIN, oder mache ich gerade einen Denkfehler?

mkinzler 6. Apr 2012 14:02

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Im Originalbeispiel sind es alles Innerjoins. Ein Outerjoin würde ja alle Datensätze eier Tabelle liefern.

DeddyH 6. Apr 2012 14:05

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Im Original sind es OUTER JOINS, Du hast vermutlich das LEFT übersehen, weil Jürgen es klein geschrieben hat.

mkinzler 6. Apr 2012 14:11

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
Ich habe seine Antwort nocheinmal gelesen und gesehe, dass ich ihn falsch verstanden habe.
Er will ja alle Adressen haben, mit jeweils verknüpften Kontaktpersonen und Wartungsverträgen; also ist LEFT OUTER JOIN richtig.

Mir ist aber immer noch nicht klar, wie er diese Infomationen in der Ergenismenge erhalten will ( Personen/Verträge als Listen in einem Feld?)

juergen 6. Apr 2012 14:21

AW: Abfrage von 3 Tabellen mit 2x Left Join.... Geht das?
 
@mkinzler,

ich "verteile" die Ergebnismenge auf relativ viele Spalten in ein Quantum-Grid.
Es gibt dann 2 Optionen der Anzeige:
1. Nur Adresstamm (dann gibt es pro Adresstamm auch nur einen Datensatz)
2. Adresstamm mit Kontaktpersonen und mit Wartungsverträgen (dann gibt es so viele Datensätze pro Adresstamm wie es Kontaktpersonen und Wartungsvertäge gibt)


Das Ganze scheint wie gewünscht zu funktioneren (mit Vorschlag von DeddyH aus Post #3. :-D

:dp:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:09 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