AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL-Abfrage über mehrere Tabellen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfrage über mehrere Tabellen

Ein Thema von Chaoten-Joe · begonnen am 15. Dez 2009 · letzter Beitrag vom 17. Dez 2009
Antwort Antwort
Chaoten-Joe

Registriert seit: 11. Mär 2007
Ort: Werl
41 Beiträge
 
Turbo Delphi für Win32
 
#1

SQL-Abfrage über mehrere Tabellen

  Alt 15. Dez 2009, 19:58
Datenbank: Paradox • Zugriff über: BDE
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
Christian Becker
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#2

Re: SQL-Abfrage über mehrere Tabellen

  Alt 15. Dez 2009, 20:11
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).
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: SQL-Abfrage über mehrere Tabellen

  Alt 15. Dez 2009, 21:03
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]
Heiko
  Mit Zitat antworten Zitat
Chaoten-Joe

Registriert seit: 11. Mär 2007
Ort: Werl
41 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: SQL-Abfrage über mehrere Tabellen

  Alt 15. Dez 2009, 22:18
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 ))

Gruß
Christian
Christian Becker
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: SQL-Abfrage über mehrere Tabellen

  Alt 16. Dez 2009, 06:45
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.
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

Re: SQL-Abfrage über mehrere Tabellen

  Alt 16. Dez 2009, 11:30
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.893 Beiträge
 
Delphi 12 Athens
 
#7

Re: SQL-Abfrage über mehrere Tabellen

  Alt 16. Dez 2009, 11:52
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
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: SQL-Abfrage über mehrere Tabellen

  Alt 17. Dez 2009, 12:16
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
Heiko
  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 13:29 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