SQL über 2 Tabellen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

SQL über 2 Tabellen

Beitrag 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:

Code: Alles auswählen

Select Nachname From Person Where FID=133
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
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL über 2 Tabellen

Beitrag 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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL über 2 Tabellen

Beitrag 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
DB-Beziehung.gif (18.25 KiB) 5470 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
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL über 2 Tabellen

Beitrag 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
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL über 2 Tabellen

Beitrag 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:

Code: Alles auswählen

WHERE "Person"."FID" = "Firma"."FID"
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
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL über 2 Tabellen

Beitrag von RobertG »

Hallo Stephan,

genau, die Bedingung

Code: Alles auswählen

WHERE "Person"."FID" = "Firma"."FID"
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
Antworten