Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage über mehrere Tabellen (https://www.delphipraxis.net/144748-sql-abfrage-ueber-mehrere-tabellen.html)

Chaoten-Joe 15. Dez 2009 18:58

Datenbank: Paradox • Zugriff über: BDE

SQL-Abfrage über mehrere Tabellen
 
Hallo zusammen,

ich bastele gerade verzweifelt an einer SQL-Abfrage, bei der mehrere Tabellen einbezogen werden müssen. Leider bin ich mit INNER JOIN & Co. nicht ganz so fit. Die meisten Beispiele dazu betreffen i.d.R. auch nur zwei Tabellen, von daher habe ich für mein Beispiel nicht viel ableiten können.

Lange Rede, kurzer Sinn. Hier mein Problem: Ich habe eine Tabelle, in der Projekte gespeicher sind. Dort gibt es u.a. das Feld "Aufgabengebiet".
Dann gibt es drei weitere Tabellen: "Verantwortlich", "Helfer" und "Gehilfen". In jeder dieser Tabellen gibt es ein Feld, in dem ein "Name" gespeichert werden kann. Nun möchte ich mit einer Abfrage alle Namen aus den Tabellen "Verantwortlich", "Helfer" und "Gehilfen" aufgelistet bekommen, die mit einem bestimmten Projekt in Verbindung stehen. In jedem Datensatz dieser Tabellen ist auch das Aufgabengebiet gespeichert.

Ich bekomme es irgendwie nicht hin, dass er mir nun alle Namen aus allen drei Tabellen "Verantwortlich", "Helfer" und "Gehilfen" zu einem bestimmten Projekt anzeigt.

Solange es nur die "Projekt-Tabelle" und eine Untertabelle ist, ist es kein Problem:
Delphi-Quellcode:
SELECT p.Aufgabengebiet, h.Helfer FROM Projekte p
LEFT OUTER JOIN Helfer h ON (p.Aufgabengebiet = h.Aufgabengebiet)
WHERE p.Aufgabengebiet = "Testprojekt"
ORDER BY p.Aufgabengebiet
Hat jemand eine Idee? Wäre super dankbar dafür ...

Liebe Grüße
Chaoten-Joe

Jürgen Thomas 15. Dez 2009 19:11

Re: SQL-Abfrage über mehrere Tabellen
 
Hallo,

wenn die Ausgangslage die Projekt-Tabelle ist (was auch durch die WHERE-Klausel bestätigt wird) und du die dazugehörigen Werte aus den untergeordneten Tabellen haben willst, dann ist das normalerweise ein Fall für INNER JOIN. Zur Erläuterung siehe z.B. Wikibooks: Einführung in SQL - JOINs. (Aber vielleicht habe ich die Aufgabenstellung nicht verstanden; ggf. könntest du die Tabellenstruktur etwas genauer angeben. Aber das ist erst nötig, wenn andere Helfer auch danach fragen.)

Es kommt mir auch komisch vor, dass die Verknüpfung durch das String-Feld "Aufgabengebiet" bestimmt wird. Dazu gehört üblicherweise ein ForeignKey, der sich auf einen PrimaryKey bezieht, und solche Keys sind IDs o.ä.

Gruß Jürgen

PS. Zur SQL-Formatierung gibt es den SQL-Button (anstelle des Delphi-Buttons).

hoika 15. Dez 2009 20:03

Re: SQL-Abfrage über mehrere Tabellen
 
Hallo,

da du ja keine genaue Tabellen-Beschreibung lieferst Kritik !!! ...

Tab_1.Id

Tab_2.Id
Tab_2.Tab_1_Id
Tab_2.Name

Tab_3.Id
Tab_3.Tab_2_Id
Tab_3.Name

SQL-Code:
Select
  Tab_1.*,
  Tab_2.Name As Tab2_Name,
  Tab_3.Name As Tab3_Name
From Tab_1
Left Join Tab_2 On Tab_2.Tab_1.Id=Tab_1.Id
Left Join Tab_3 On Tab_3.Tab_1.Id=Tab_1.Id
Kleiner Hinweise (jaja)

Paradox ist nicht die erst Wahl ...
Komm jetzt nicht mit die Frage "Warum ist das so lamgsam"


Heiko

[edit=mkinzler]SQL-Tag eingefügt Mfg, mkinzler[/edit]

Chaoten-Joe 15. Dez 2009 21:18

Re: SQL-Abfrage über mehrere Tabellen
 
Vielen Dank. Das funktioniert schon mal.
Und klar ... Paradox und BDE sind nicht erste Wahl. Aber meine Programme bestehen teilweise schon seit knapp 10 Jahren und ich habe sie ständig erweitert. Da will ich nicht das Grundgerüst neu aufbauen - solange alles gut funktioniert ...

Zur Struktur der Tabellen:

Projekte.ID
Projekte.Aufgabengebiet
Projekte.etc

Verantwortlich.ID
Verantwortlich.Aufgabengebiet
Verantwortlich.Name
Verantwortlich.eMail
Veratwortlich.etc

Gehilfe.ID
Gehilfe.Aufgabengebiet
Gehilfe.Name
Gehilfe.eMail
Gehilfe.etc

Helfer.ID
Helfer.Aufgabengebiet
Helfer.Name
Helfer.eMail
Helfer.etc

Wie gesagt. In der Auswertung werden nun alle Personen angezeigt. Aber eben mehrfach (durch die einzelnen Spalten).
SQL-Code:
SELECT DISTINCT p.Aufgabengebiet, h.Helfer, g.Gehilfe, v.Verantwortlich
FROM Projekte p
LEFT JOIN Helfer h ON (p.Aufgabengebiet = h.Aufgabengebiet)
LEFT JOIN Gehilfen g ON (p.Aufgabengebiet = g.Aufgabengebiet)
LEFT JOIN Verantwortlich v ON (p.Aufgabengebiet = v.Aufgabengebiet)
WHERE p.Aufgabengebiet = "Testprojekt"
Danke auch für den Wiki-Link. Habe auch schon GROUP BY eingebaut. Hat auch nicht funktioniert. Ich WÜNSCHE mir im Prinzip EINE Ergebnisliste mit allen Namen (und das nicht doppelt und dreifach). Ist doch bald Weihnachen ... da muss doch was zu machen sein :o))

Gruß
Christian

sx2008 16. Dez 2009 05:45

Re: SQL-Abfrage über mehrere Tabellen
 
Zitat:

Zitat von Chaoten-Joe
Dann gibt es drei weitere Tabellen: "Verantwortlich", "Helfer" und "Gehilfen".

Was ist der Unterschied zwischen "Helfer" und "Gehilfe"?
Schwierig zu erklären, ist ja fast das Gleiche oder?
Was ist die Gemeinsamkeit von "Verantwortlich", "Helfer" und "Gehilfen"?
Es sind alles Personen, oder?
Nach diesen unscheinbaren Fragen sollte sich die Frage stellen:
warum speicherst du diese Infos in DREI Tabellen?
Eigentlich bräuchte man eine Personen-Tabelle.
"Heinz Müller" ist im Projekt A der Verantwortliche und im Projekt B aber nur ein Helfer.

Das neue DB-Design:
Tabelle Projekte
Tabelle Personen
Tabellen ProjektPersonen
Die Tabelle ProjektPersonen erzeugt eine N:M Verknüpfung und sieht so aus:
Code:
IdProjekt | IdPerson | Rolle
=====================================
10        |        1 | V
10        |        5 | H
10        |        6 | H
10        |        7 | G
11        |        5 | V
11        |        7 | H
Das Feld Rolle zeigt an, ob es sich um den Verantwortlichen, Helfer oder Gehilfen handelt.
Keine Ahnung, ob du dein DB-Design ändern kannst, aber so wäre es besser und die Abfragen wären einfacher.

p80286 16. Dez 2009 10:30

Re: SQL-Abfrage über mehrere Tabellen
 
Zitat:

Zitat von Chaoten-Joe
... Hat auch nicht funktioniert. Ich WÜNSCHE mir im Prinzip EINE Ergebnisliste mit allen Namen (und das nicht doppelt und dreifach). Ist doch bald Weihnachen ... da muss doch was zu machen sein

Wenn ich jetzt wüßte was Du meinst! So vermute ich mal:
Du bekommst:

Code:
projekt1,verantwortlich1,Helfer1
projekt1,verantwortlich1,Helfer2

projekt2,verantwortlich1,Helfer1,gehilfe1
projekt2,verantwortlich1,Helfer1,gehilfe2
projekt2,verantwortlich1,Helfer2,gehilfe1
projekt2,verantwortlich1,Helfer2,gehilfe1

Projekt3,verantwortlich2
und Du hättest gerne:
Code:
projekt1,verantwortlich1,Helfer1 Helfer2

projekt2,verantwortlich1,Helfer1 Helfer2,gehilfe1 gehilfe2

Projekt3,verantwortlich2
Gruß
K-H

TBx 16. Dez 2009 10:52

Re: SQL-Abfrage über mehrere Tabellen
 
Wenn ich Dich richtig verstehe, möchtest Du alle Personen haben, die mit dem jeweiligen Aufgabengebiet befaßt sind.
Das ist ein Fall für UNION SELECT.
Mal grob aus dem Kopf skizziert:
SQL-Code:
SELECT HELFER FROM HELFER WHERE AUFGABENGEBIET = :AUFGABENGEBIET
UNION
SELECT GEHILFE FROM GEHILFEN WHERE AUFGABENGEBIET = :AUFGABENGEBIET
UNION
SELECT VERANTWORTLICH FROM VERANTWORTLICH WHERE AUFGABENGEBIET = :AUFGABENGEBIET
ORDER BY 1
Hope it helps

hoika 17. Dez 2009 11:16

Re: SQL-Abfrage über mehrere Tabellen
 
Hallo,

du willst bestimmt keine doppelten Personen,
also wenn einer Helfer oder Gehilfe ist.

Der obige Code sollte klappen.

Aber:
Die Datenbank-Struktur ist sagen wir mal "sub-optimal".


Heiko


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