Seite 1 von 1
SQL über 2 Tabellen
Verfasst: Mi, 17.05.2017 12:57
von Stephan
Hallo,
ich habe eine HSQL-Datenbank in LibreOffice 5.1.6 erstellt die 2 Tabellen (Firma, Person) enthält die über das Feld "FID" verbunden sind (Beziehung).
Ich führe im SQL-Fenster aus:
Code: Alles auswählen
Select FID From Firma Where Firmenname = 'Kreissparkasse MOL'
das liefert, richtigerweise, zwei Werte (133 und 134)
nun möchte ich dieses Ergebnis in einem weiteren Statement nutzen.
Testweise funktioniert und liefert ein Teilergebnis:
nicht jedoch funktioniert:
Code: Alles auswählen
Select Nachname From Person Where FID=(Select FID From Firma Where Firmenname = 'Kreissparkasse MOL')
sondern ich bekomme die Fehlermeldung: "Single value expected".
Wie stelle ich das an, damit es klappt?
Testweise habe ich es mit einem alternativen Ausdruck (im funktionellen Sinne eines JOIN) versucht:
Code: Alles auswählen
Select Nachname From Person,Firma Where Firmenname = 'Kreissparkasse MOL'
dabei hängt sich LO auf.
Gruß
Stephan
Re: SQL über 2 Tabellen
Verfasst: Mi, 17.05.2017 19:42
von RobertG
Hallo Stephan,
Code: Alles auswählen
Select Nachname From Person Where FID IN (Select FID From Firma Where Firmenname = 'Kreissparkasse MOL')
Eine Unterabfrage darf in der Regel nur auf einen Wert hinweisen. Mit dem obigen Code verweist IN auf eine Menge hin. Hier dürfen dann mehrere Werte enthalten sein.
Code: Alles auswählen
Select Person.Nachname From Person, Firma Where Person.FID = Firma.FID AND Firma.Firmenname = 'Kreissparkasse MOL'
dürfte übrigens das gleiche Ergebnis liefern.
Bei
Code: Alles auswählen
Select Nachname From Person,Firma Where Firmenname = 'Kreissparkasse MOL'
hängt sich Base auf, weil die beiden Tabellen, die in der Abfrage enthalten sind, keine Verknüpfung haben. Es werden alle Datensätze aus "Person" zumindest mit den beiden Datensätzen für den Firmennamen verbunden, d.h. Du verdoppelst die Anzahl der Datensätze von "Person" - sofern Base überhaupt die Zuordnung in WHERE korrekt der Tabelle "Firma" zuordnen kann.
Gruß
Robert
Re: SQL über 2 Tabellen
Verfasst: Mi, 17.05.2017 20:08
von Stephan
Hallo Robert,
Hallo Stephan,
Code: Alles auswählen
Select Nachname From Person Where FID IN (Select FID From Firma Where Firmenname = 'Kreissparkasse MOL')
Eine Unterabfrage darf in der Regel nur auf einen Wert hinweisen. Mit dem obigen Code verweist IN auf eine Menge hin. Hier dürfen dann mehrere Werte enthalten sein.
Code: Alles auswählen
Select Person.Nachname From Person, Firma Where Person.FID = Firma.FID AND Firma.Firmenname = 'Kreissparkasse MOL'
dürfte übrigens das gleiche Ergebnis liefern.
Danke dafür, ich probiere es aber erst morgen aus.
hängt sich Base auf, weil die beiden Tabellen, die in der Abfrage enthalten sind, keine Verknüpfung haben.
zählt denn dabei die genannte Beziehung nicht?
- DB-Beziehung.gif (18.25 KiB) 5500 mal betrachtet
Beim SQL-Ausdruck selber, glaubte ich, das ich die Tabellennamen durch Komma getrennt als Äquivalent zu JOIN nutzen kann.?
Gibt es vielleicht im Netz eine gute Übersicht was speziell OO/LO in SQL-Ausdrücken alles aktzeptieren? Mir ist bisher nichts aufgefallen und so nutze ich allgemeine SEiten zu SQL oder muss in diversen Base-Dokus schauen ob da das gerade Passende dabei ist.
Gruß
Stephan
Re: SQL über 2 Tabellen
Verfasst: Do, 18.05.2017 20:38
von RobertG
Hallo Stephan,
bei Abfragen ist es so, dass die grundsätzlich nur dann etwas mit der ursprünglichen Beziehung zu tun haben, wenn Du diese Beziehung auch in der Abfrage nutzt. Das macht Base automatisch, wenn Du beide Tabellen zusammen in der Abfrage-GUI einfügst. Dann steht diese Verbindung. Du kannst sie aber sehr wohl lösen. Das gilt auch für andere Datenbanken, dass bei Abfragen nicht die vorgegebenen Beziehungen der Tabellen berücksichtigt werden.
Grundsätzlich: Wenn Du Tabellen durch ein Komma getrennt angibst, dann musst Du eine Bedingung definieren, wie die Tabellen miteinander verbunden werden. Ansonsten werden alle Datensätze der ersten Tabelle mit allen Datensätzen der 2. Tabelle verknüpft.
Informationsquelle für die interne HSQLDB ist
http://hsqldb.org/doc/guide/ch09.html#. Das habe ich für das Handbuch auch genutzt.
Gruß
Robert
Re: SQL über 2 Tabellen
Verfasst: Fr, 19.05.2017 09:40
von Stephan
Hallo Robert,
Das macht Base automatisch, wenn Du beide Tabellen zusammen in der Abfrage-GUI einfügst.
Ok, ich habe es ausprobiert und das funktioniert.
Wenn ich die Abfrage speichere und mir dann das SQL anschaue (das Base automatisch erzeugt hat) sehe ich sowas wie:
Code: Alles auswählen
SELECT "Person"."Nachname" FROM "Person", "Firma" WHERE "Person"."FID" = "Firma"."FID" AND "Person"."Nachname" = 'Firma="Kreissparkasse MOL"'
hierin wäre somit der Abschnitt:
das was Deiner Aussage:
Wenn Du Tabellen durch ein Komma getrennt angibst, dann musst Du eine Bedingung definieren, wie die Tabellen miteinander verbunden werden
entsprich?
GRuß
Stephan
Re: SQL über 2 Tabellen
Verfasst: Fr, 19.05.2017 12:37
von RobertG
Hallo Stephan,
genau, die Bedingung
verbindet die beiden Tabellen in der Abfrage so miteinander, wie Du das auch in den Beziehungen bereits definiert hast. Sie zeigt allerdings nur die Datensätze an, bei denen ein Eintrag unter "Person"."FID" auch tatsächlich existiert. Personen ohne Firmenangabe werden nicht wiedergegeben.
Gruß
Robert