BITTE helfen Sie uns HEUTE mit einer SPENDE
Helfen Sie das LibreOffice Forum zu erhalten!

❤️ DANKE >><< DANKE ❤️

> KEINE WERBUNG FÜR REGISTRIERTE BENUTZER!<
Ihre Spende wird für die Deckung der laufenden Kosten sowie den Erhalt und Ausbau 🌱 des LibreOffice Forums verwendet.
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

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

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Pit Zyclade
Beiträge: 2674
Registriert: Mo 12. Nov 2012, 16:59

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

Beitrag von Pit Zyclade » Fr 11. Aug 2017, 13:24

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
Zuletzt geändert von Pit Zyclade am So 13. Aug 2017, 22:19, insgesamt 4-mal geändert.
LO 7.5.8.2 (X86_64) / AOO 4.1.14 / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

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

Beitrag von RobertG » Fr 11. Aug 2017, 16:16

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
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Pit Zyclade
Beiträge: 2674
Registriert: Mo 12. Nov 2012, 16:59

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

Beitrag von Pit Zyclade » Fr 11. Aug 2017, 17:15

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
Zuletzt geändert von Pit Zyclade am Sa 12. Aug 2017, 10:41, insgesamt 1-mal geändert.
LO 7.5.8.2 (X86_64) / AOO 4.1.14 / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

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

Beitrag von RobertG » Fr 11. Aug 2017, 19:27

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
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Pit Zyclade
Beiträge: 2674
Registriert: Mo 12. Nov 2012, 16:59

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

Beitrag von Pit Zyclade » Fr 11. Aug 2017, 19:49

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
Zuletzt geändert von Pit Zyclade am Sa 12. Aug 2017, 10:41, insgesamt 1-mal geändert.
LO 7.5.8.2 (X86_64) / AOO 4.1.14 / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

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

Beitrag von RobertG » Fr 11. Aug 2017, 21:45

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
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Pit Zyclade
Beiträge: 2674
Registriert: Mo 12. Nov 2012, 16:59

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

Beitrag von Pit Zyclade » Fr 11. Aug 2017, 22:12

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
Zuletzt geändert von Pit Zyclade am Sa 12. Aug 2017, 10:40, insgesamt 1-mal geändert.
LO 7.5.8.2 (X86_64) / AOO 4.1.14 / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.

Pit Zyclade
Beiträge: 2674
Registriert: Mo 12. Nov 2012, 16:59

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

Beitrag von Pit Zyclade » Sa 12. Aug 2017, 10:34

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
Zuletzt geändert von Pit Zyclade am Sa 12. Aug 2017, 11:54, insgesamt 1-mal geändert.
LO 7.5.8.2 (X86_64) / AOO 4.1.14 / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.

RobertG
Beiträge: 2732
Registriert: Sa 19. Mai 2012, 17:37
Kontaktdaten:

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

Beitrag von RobertG » Sa 12. Aug 2017, 11:14

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
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare

Pit Zyclade
Beiträge: 2674
Registriert: Mo 12. Nov 2012, 16:59

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

Beitrag von Pit Zyclade » Sa 12. Aug 2017, 11:49

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
LO 7.5.8.2 (X86_64) / AOO 4.1.14 / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.

An alle, die das LibreOffice-Forum nutzen:


Bitte beteiligen Sie sich mit 7 Euro pro Monat und helfen uns bei unserem Budget für das Jahr 2024.
Einfach per Kreditkarte oder PayPal.
Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet.

❤️ Vielen lieben Dank für Ihre Unterstützung ❤️

Antworten