![]() |
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:
Hat jemand eine Idee? Wäre super dankbar dafür ...
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 Liebe Grüße Chaoten-Joe |
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. ![]() 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). |
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:
Kleiner Hinweise (jaja)
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 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] |
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:
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))
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" Gruß Christian |
Re: SQL-Abfrage über mehrere Tabellen
Zitat:
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:
Das Feld Rolle zeigt an, ob es sich um den Verantwortlichen, Helfer oder Gehilfen handelt.
IdProjekt | IdPerson | Rolle
===================================== 10 | 1 | V 10 | 5 | H 10 | 6 | H 10 | 7 | G 11 | 5 | V 11 | 7 | H Keine Ahnung, ob du dein DB-Design ändern kannst, aber so wäre es besser und die Abfragen wären einfacher. |
Re: SQL-Abfrage über mehrere Tabellen
Zitat:
Du bekommst:
Code:
und Du hättest gerne:
projekt1,verantwortlich1,Helfer1
projekt1,verantwortlich1,Helfer2 projekt2,verantwortlich1,Helfer1,gehilfe1 projekt2,verantwortlich1,Helfer1,gehilfe2 projekt2,verantwortlich1,Helfer2,gehilfe1 projekt2,verantwortlich1,Helfer2,gehilfe1 Projekt3,verantwortlich2
Code:
Gruß
projekt1,verantwortlich1,Helfer1 Helfer2
projekt2,verantwortlich1,Helfer1 Helfer2,gehilfe1 gehilfe2 Projekt3,verantwortlich2 K-H |
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:
Hope it helps
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 |
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 20:50 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