Seite 1 von 2

[gelöst] SQL in Abfrage: Drei Tabellen in 1:n Beziehung abbilden?

Verfasst: Fr 11. Aug 2017, 13:24
von Pit Zyclade
Hallo
Formulare sollen sich auf Tabellen oder Abfragen beziehen.
Bei der Gestaltung eine Abfrage über 3 Tabellen, bei denen die zweite und dritte in einer 1:n Beziehung zur 1. stehen und die dritte wenige Datensätze enthät (gemeinsamer Parameter "Nummer"), stoße ich mit der GUI an die Grenzen und an meine und würde deshalb gerne SQL zur Korrektur benutzen. In Tabelle 2 und drei wirkt noch ein Feld "Selektion" für eine Auswahl.
Resultieren soll eigentlich eine Tabelle mit Feldern aus Tabelle 1 und Tabelle 2 und sofern passende Datensätze in Tabelle 3 vorhanden sind auch mit diesen. Aber es sollen auch Datensätze angezeigt werden, wenn in Tabelle 3 keine passenden sind, also dürfen die entsprechenden Felder dann leer bleiben.
Mein Versuch bisher war zwar widerspruchsfrei aber zeigte immer nur Datesätze an, die auch aus Tabelle 3 etwas beitragen können und das sind wenige...
SELECT "Tab1"."NUMMER" , "Tab1"."FELD2", "Tab1"."FELD3", "Tab1"."FELD4", "Tab2"."Selektion" , "Tab2"."NUMMER" , "Tab2"."FELD6" , "Tab3"."Selektion" , "Tab3"."NUMMER" , "Tab3"."FELD6" FROM "Tab1", "Tab2", "Tab3" WHERE ( "Tab2"."Selektion" = TRUE AND "Tab2"."NUMMER" = "Tab1"."NUMMER" AND "Tab3"."NUMMER" = "Tab1"."NUMMER")
Danke für Hilfe
Pit

Re: SQL in Abfrage: Zwei Tabellen in 1:n Beziehung abbilden?

Verfasst: Fr 11. Aug 2017, 16:16
von RobertG
Hallo Pit,

Du musst mit einem LEFT JOIN arbeiten:

Code: Alles auswählen

SELECT "Tabelle1".*, "Tabelle2".* FROM "Tabelle1" LEFT JOIN "Tabelle2" ON "Tabelle1"."Tab2ID" = "Tabelle2"."ID"
So etwas zeigt alle Daten aus Tabelle 1 an, auch wenn in Tabelle 2 dazu keine Datensätze vorhanden sind.

Gruß

Robert

Re: SQL in Abfrage: Drei Tabellen in 1:n Beziehung abbilden?

Verfasst: Fr 11. Aug 2017, 17:15
von Pit Zyclade
Danke,
Nun hawe ich neue Fragen:
1. Die Verbindung wird also eigentlich mit Formel Tabelle1 aaa JOIN xxx ON bewirkt, wobei aaa = [LEFT|RIGHT] , xxx = Tabelle2 ?
2. Das aaa = [LEFT|RIGHT] gibt an, von welcher Tabelle.Felder komplett übernommen werden?
3. Erst nach der o.g. Formel werden die Bedingungen angegeben, die die Tabellen verbinden? Hierbei wird also kein WHERE benötigt?
4. Wenn man weitere Filter angeben will, wird WHERE benötigt? Wenn ja, an welcher Stelle?
5. Kann man auf dieselbe einfache Weise noch eine weitere Tabelle verbinden oder muss man eine klammernde Formel anwenden?
Pit

Re: SQL in Abfrage: Zwei Tabellen in 1:n Beziehung abbilden?

Verfasst: Fr 11. Aug 2017, 19:27
von RobertG
Hallo Pit,
Pit Zyclade hat geschrieben:
Fr 11. Aug 2017, 17:15
1. Die Verbindung wird also eigentlich mit Formel Tabelle1 aaa JOIN xxx ON bewirkt, wobei aaa = [LEFT|RIGHT] , xxx = Tabelle2 ?
Korrekt.
Pit Zyclade hat geschrieben:
Fr 11. Aug 2017, 17:15
2. Das aaa = [LEFT|RIGHT] gibt an, von welcher Tabelle.Felder komplett übernommen werden?
LEFT: die links stehende Tabelle; RIGHT: die rechts stehende Tabelle
... aber was machst Du, wenn mehrere Tabellen verbunden werden und Du laufend die Seite wechselst. Deshalb nutze ich nur LEFT.
Pit Zyclade hat geschrieben:
Fr 11. Aug 2017, 17:15
3. Erst nach der o.g. Formel werden die Bedingungen angegeben, die die Tabellen verbinden? Hierbei wird also kein WHERE benötigt?
Zur Verknüpfung der Tabellen: ON
Anschließend kannst Du noch Zusatzbedingungen mit AND, OR und WHERE hinzufügen.
Pit Zyclade hat geschrieben:
Fr 11. Aug 2017, 17:15
4. Wenn man weitere Filter angeben will, wird WHERE benötigt? Wenn ja, an welcher Stelle?
Nein, es geht auch einfach weiter mit z.B. AND ...
Pit Zyclade hat geschrieben:
Fr 11. Aug 2017, 17:15
5. Kann man auf dieselbe einfache Weise noch eine weitere Tabelle verbinden oder muss man eine klammernde Formel anwenden?
Die geschweiften Klammern, die Base hier in der GUI hinzufügt, sind optional.

Code: Alles auswählen

SELECT "Tabelle1".*, "Tabelle2".*, "Tabelle3" FROM "Tabelle1" LEFT JOIN "Tabelle2" ON "Tabelle1"."Tab2ID" = "Tabelle2"."ID" LEFT JOIN "Tabelle3" ON "Tabelle2"."Tab3ID" = "Tabelle3"."ID" AND "Tabelle1"."Name" = 'Egon'
Alle Datensätze aus Tabelle1, deren "Name" 'Egon' ist, werden angezeigt - sowie gegebenenfalls Verbindungen zu den anderen Tabellen.
Achtung! Wenn Du z.B. "Tabelle3"."Name" = 'Egon' anhängst, dann werden zwar alle Datensätze von "Tabelle1" weiter angezeigt. Von "Tabelle3" siehst Du aber nur die Datensätze, bei denen "Name" = 'Egon' ist. Du filterst also nicht den Gesamtbestand der Daten.

Gruß

Robert

Re: SQL in Abfrage: Drei Tabellen in 1:n Beziehung abbilden?

Verfasst: Fr 11. Aug 2017, 19:49
von Pit Zyclade
Nachtrag:

Ich möchte 3 Tabellen, so wie von Dir vorgeschlagen, verbinden, wobei Tab2 und Tab3 jeweils einen Filter namens "Selektion" haben.
Wenn ich
SELECT "Tab1".*, "Tab2".* , "Tab3".* FROM "Tab1" LEFT JOIN "Tab2" ON "Tab2"."NUMMER" = "Tab1"."NUMMER" LEFT JOIN "Tab3" ON "Tab3"."NUMMER" = "Tab2"."NUMMER"
WHERE "Tab2"."Selektion" = TRUE
abfrage, werden die Tabelle 1 mit der zweiten korrekt verbunden, sogar mit der dritten.
Aber wie füge ich den Filter "Tab3"."Selektion" = TRUE zusätzlich ein, ohne dass ich Datensätze der ersten Tabelle einschränke? Binde ich an die WHERE-Liste mit AND an, kommen nur noch 2 Datensätze raus, obwohl es 23 sein müßten! Offenbar klappt das mit der zweimaligen JOIN ... ON ... Formel nicht so richtig?

Danke für Hinweise. Irgendwie habe ich ein Brett vor dem Kopf.
Pit

Re: SQL in Abfrage: Zwei Tabellen in 1:n Beziehung abbilden?

Verfasst: Fr 11. Aug 2017, 21:45
von RobertG
Hallo Pit,

versuche einmal die Zusatzbedingungen dort einzusetzen, wo Du gerade die Tabellen definiert hast:

Code: Alles auswählen

SELECT "Tab1".*, "Tab2".* , "Tab3".* FROM "Tab1" 
LEFT JOIN "Tab2" ON "Tab2"."NUMMER" = "Tab1"."NUMMER" AND "Tab2"."Selektion" = TRUE 
LEFT JOIN "Tab3" ON "Tab3"."NUMMER" = "Tab2"."NUMMER" AND "Tab3"."Selektion" = TRUE 
Ich habe das auch hier erst einmal ausprobiert. Mit der Variante "alles zum Schluss" scheint die interne Datenbank Probleme zu haben.

Gruß

Robert

Re: SQL in Abfrage: Drei Tabellen in 1:n Beziehung abbilden?

Verfasst: Fr 11. Aug 2017, 22:12
von Pit Zyclade
Jaaa! Unsere Antworten haben sich insofern überschnitten, dass ich gerade vor Minuten selbst diese Lösung fand und erst jetzt Deine Antwort.
Aber ich fühle mich bestätigt. Danke Dir!

Gruß
Pit

Re: SQL in Abfrage: Drei Tabellen in 1:n Beziehung abbilden?

Verfasst: Sa 12. Aug 2017, 10:34
von Pit Zyclade
Ich war vorschnell! Die Sache löst sich nicht so einfach!

Code: Alles auswählen

SELECT "Tab1".*, "Tab2".*, "Tab3".*
 FROM "Tab1" LEFT JOIN "Tab2" ON  "Tab2"."NUMMER" = "Tab1"."NUMMER" AND "Tab2"."Selektion" = TRUE
 LEFT JOIN "Tab3" ON "Tab3"."NUMMER"  = "Tab2"."NUMMER" AND "Tab3"."Selektion" = TRUE 
In Tabelle 3 ist der Satz mit Nummer=2 auch mit Selektion=FALSE . Im Resultat wird mir bei der Abfrage kein Satz mit Nummer=2 angezeigt, obwohl in Tabelle 1 ein Satz mit Nummer=2 einmal vorhanden ist.
Also keine Besserung zum letzten Vorgehen!
Gruß
Pit

Re: SQL in Abfrage: Drei Tabellen in 1:n Beziehung abbilden?

Verfasst: Sa 12. Aug 2017, 11:14
von RobertG
Hallo Pit,

ich kenne Deine Tabellen nicht, aber nach meinem Verständnis müsste das folgendermaßen funktionieren:
Du hast Tab2 mit Tab1 verbunden. Von Tab2 hast Du die Werte eingeschränkt mit "Selektion" = TRUE
Dann hast Du Tab3 mit Tab2 verbunden. Tab2 zeigt nur die Werte an, die "Selektion"=TRUE haben. Tab3 kann also nur zu diesen Werten auch Werte anzeigen. Zusätzlich hast Du die Werte von Tab3 auch noch einmal mit "Selektion" = TRUE eingeschränkt.

Wenn Du den Code wie folgt änderst, dann beeinflusst Tab2 mit seinen Werten vermutlich nicht mehr Tab3:

Code: Alles auswählen

SELECT "Tab1".*, "Tab2".*, "Tab3".*
 FROM "Tab1" LEFT JOIN "Tab2" ON  "Tab2"."NUMMER" = "Tab1"."NUMMER" AND "Tab2"."Selektion" = TRUE
 LEFT JOIN "Tab3" ON "Tab3"."NUMMER"  = "Tab1"."NUMMER" AND "Tab3"."Selektion" = TRUE 
Probiere das doch einmal aus und berichte. Ich habe das jetzt auch entsprechend im Handbuch ergänzt.

Gruß

Robert

Re: SQL in Abfrage: Drei Tabellen in 1:n Beziehung abbilden?

Verfasst: Sa 12. Aug 2017, 11:49
von Pit Zyclade
Die beiden Codes unterscheiden sich nur bezüglich Bezugsbedingung von Tabelle3 auf Tabelle 2 oder Tabelle 1.
Das hatte ich aber schon selbst probiert und das ändert nichts am Ausgang: Es erscheint kein Satz mit Nummer=2 , obwohl sowohl in Tabelle 1 genau einer vorhanden ist und in Tabelle 2 ebenfalls genau einer mit Selektion=TRUE , weitere mit Nummer=2 und Selektion=FALSE. Nur in Tabelle 3 ist keiner mit Nummer = 2 und zugleich Selektion = TRUE, nur einer mit Selektion = FALSE. Aber diese Tatsache verhindert die Anzeige, also filtert die Sätze aus Tabelle 1 neraus, obwohl das nicht sein dürfte.
Wenn Dir keine funktionierende SQL-Formal einfällt, bleibt mir nur eine Abfrage mit Tabelle 1 JOIN Tabelle 2 und dann eine aufgepfropfte Abfrage, die dieses Resultat, nennen wir es mal Abfrage 4 (oder Tabelle 4, falls das auch noch erforderlich wird) dann mit LEFT JOIN zu Tabelle 3 mit den Bedingungen macht.
Hier ergibt sich für mich schon die Frage, ob sich bei veränderten Daten bei Aufruf der aufgepfropften Abfrage die zugrundeliegende Abfrage selbständig aktualisiert wird oder muß man die zugrundeliegende auch noch vorher aufrufen, bevor man die aufgepfropfte nutzt. Letzteres wäre umständlich und störanfällig, weil man älter und schußliger wird.

Gruß
Pit