Linker Verbund, Fehler in Abfragen ab drei Tabellen
Moderator: Moderatoren
Linker Verbund, Fehler in Abfragen ab drei Tabellen
Das Umsetzen einer speziellen Abfrage über mehrere Tabellen scheitert:
Es existieren die drei Tabellen "Orte", "Strassen", "Hausnummern" mit dem Integer-Feld "ID" als Primär-Schlüssel. In "Strassen" gibt es ein Interger-Feld "OrteID" und in "Hausnummern" das Interger-Feld "StrassenID". Alle Tabellen haben zwei Datensätze mit der ID "0" und "1".
In einer Abfrage sind alle drei Tabellen hinzugefügt worden. Zwischen "Orte.ID" und "Strassen.OrteID" gibt es die Verbundeigenschaft, derart dass alle Daten aus "Orte" enthalten sind und die aus "Strassen", bei denen die Inhalte gleich sind. Zwischen "Strassen.ID" und "Hausnummern.StrassenID" gibt es eine Verbundeigenschaft, dass alle Daten aus "Strassen" enthalten sind und die aus "Hausnummern", bei denen die Inhalte gleich sind.
Das Ausführen der Abfrage führt zu einem Fehler:
SQL-Status: 37000
Fehler-Code: -11
Unexpected token Orte, requires SELECT in statement
[SELECT "Orte".*, "Strassen".*, "Hausnummern".* FROM (
"Orte" LEFT OUTER JOIN "Strassen"
ON
"Orte"."ID" = "Strassen"."OrteID"
)
LEFT OUTER JOIN "Hausnummern"
ON
"Strassen"."ID" = "Hausnummern"."StrassenID"
]
An welcher Stelle wird ein SELECT erwartet?
Es funktioniert ohne die dritte Tabelle "Hausnummern", also nur mit "Orte" und "Strassen".
Es funktioniert, wenn der Verbund zwischen "Orte" und "Strassen" auf "innere" umgelegt wird:
SELECT "Orte".*, "Strassen".*, "Hausnummern".* FROM {
OJ "Strassen" LEFT OUTER JOIN "Hausnummern"
ON
"Strassen"."ID" = "Hausnummern"."StrassenID"
},
"Orte" WHERE (
"Orte"."ID" = "Strassen"."OrteID"
)
Ist der 1:[0..n]:[0..n]-Ansatz falsch?
Ist die Umsetzung in SQL falsch?
Scharschi
OOoPortable 2.1
Es existieren die drei Tabellen "Orte", "Strassen", "Hausnummern" mit dem Integer-Feld "ID" als Primär-Schlüssel. In "Strassen" gibt es ein Interger-Feld "OrteID" und in "Hausnummern" das Interger-Feld "StrassenID". Alle Tabellen haben zwei Datensätze mit der ID "0" und "1".
In einer Abfrage sind alle drei Tabellen hinzugefügt worden. Zwischen "Orte.ID" und "Strassen.OrteID" gibt es die Verbundeigenschaft, derart dass alle Daten aus "Orte" enthalten sind und die aus "Strassen", bei denen die Inhalte gleich sind. Zwischen "Strassen.ID" und "Hausnummern.StrassenID" gibt es eine Verbundeigenschaft, dass alle Daten aus "Strassen" enthalten sind und die aus "Hausnummern", bei denen die Inhalte gleich sind.
Das Ausführen der Abfrage führt zu einem Fehler:
SQL-Status: 37000
Fehler-Code: -11
Unexpected token Orte, requires SELECT in statement
[SELECT "Orte".*, "Strassen".*, "Hausnummern".* FROM (
"Orte" LEFT OUTER JOIN "Strassen"
ON
"Orte"."ID" = "Strassen"."OrteID"
)
LEFT OUTER JOIN "Hausnummern"
ON
"Strassen"."ID" = "Hausnummern"."StrassenID"
]
An welcher Stelle wird ein SELECT erwartet?
Es funktioniert ohne die dritte Tabelle "Hausnummern", also nur mit "Orte" und "Strassen".
Es funktioniert, wenn der Verbund zwischen "Orte" und "Strassen" auf "innere" umgelegt wird:
SELECT "Orte".*, "Strassen".*, "Hausnummern".* FROM {
OJ "Strassen" LEFT OUTER JOIN "Hausnummern"
ON
"Strassen"."ID" = "Hausnummern"."StrassenID"
},
"Orte" WHERE (
"Orte"."ID" = "Strassen"."OrteID"
)
Ist der 1:[0..n]:[0..n]-Ansatz falsch?
Ist die Umsetzung in SQL falsch?
Scharschi
OOoPortable 2.1
Zuletzt geändert von Scharschi am Mi, 11.07.2007 21:28, insgesamt 2-mal geändert.
Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen
Hallo Scharschi,
probiere Deine Abfrage mal ohne Klammern auszuführen.
Gruss Barlee
probiere Deine Abfrage mal ohne Klammern auszuführen.
Code: Alles auswählen
SELECT
"Orte".*,
"Strassen".*,
"Hausnummern".*
FROM
"Orte" LEFT OUTER JOIN "Strassen"
ON
"Orte"."ID" = "Strassen"."OrteID"
LEFT OUTER JOIN "Hausnummern"
ON
"Strassen"."ID" = "Hausnummern"."StrassenID"
Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen
Hallo Barlee,
herzlichen Dank! Hat auf Anhieb funktioniert.
SELECT "Orte"."Ort", "Strassen"."Straßenname", "Hausnummern"."Hausnummer" FROM {
OJ "Orte" LEFT OUTER JOIN "Strassen" ON "Orte"."ID" = "Strassen"."OrteID"
LEFT OUTER JOIN
"Hausnummern" ON "Strassen"."ID" = "Hausnummern"."StrassenID"
}
Scharschi
Aber:
Das Ein/Ausschalten der Design-Ansicht fügt die Klammern immer wieder hinzu. Wie kann man dies ändern?
herzlichen Dank! Hat auf Anhieb funktioniert.
SELECT "Orte"."Ort", "Strassen"."Straßenname", "Hausnummern"."Hausnummer" FROM {
OJ "Orte" LEFT OUTER JOIN "Strassen" ON "Orte"."ID" = "Strassen"."OrteID"
LEFT OUTER JOIN
"Hausnummern" ON "Strassen"."ID" = "Hausnummern"."StrassenID"
}
Scharschi
Aber:
Das Ein/Ausschalten der Design-Ansicht fügt die Klammern immer wieder hinzu. Wie kann man dies ändern?
Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen
Hallo Thomas,
kannst Du Deine Abfrage hier einmal reinkopieren.
Über den Grund des beschriebenen Fehlers kann man sonst nur spekulieren.
Gruß Barlee
kannst Du Deine Abfrage hier einmal reinkopieren.
Über den Grund des beschriebenen Fehlers kann man sonst nur spekulieren.
Gruß Barlee
Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen
Hallo Thomas,
die Abfrage sieht für mich ok aus.
Allerdings kann eine leere Spalte u.U. auf eine nicht erfüllte Joinbedingung hindeuten.
Beschreibe am besten einmal die Struktur der beteiligten Tabellen und das erwartete Ergebnis.
Gruß Barlee
die Abfrage sieht für mich ok aus.
Allerdings kann eine leere Spalte u.U. auf eine nicht erfüllte Joinbedingung hindeuten.
Beschreibe am besten einmal die Struktur der beteiligten Tabellen und das erwartete Ergebnis.
Gruß Barlee
Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen
Hallo Thomas,
ok, Du hast nun die Tabellen Termine, Treffpunkt, Typ.
Leider schreibst Du nichts über das erwartete Resultat. Mit Tabellen kann man viel anfangen ...
Vielleicht suchst Du das: ???????????
Gruß Barlee
ok, Du hast nun die Tabellen Termine, Treffpunkt, Typ.
Leider schreibst Du nichts über das erwartete Resultat. Mit Tabellen kann man viel anfangen ...

Vielleicht suchst Du das: ???????????
Code: Alles auswählen
select * from Termine, Typ, Treffpunkt
where Termine.TypID = Typ.ID
and Termine.Ort = Treffpunkt.ID
Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen
Hallo Thomas,
das hört sich ja fast an, als wäre meine Abfrage für Deine Zwecke richtig.
Du musst nur das
durch die Spalten ersetzen, die Du in der Ergebnistabelle haben willst. Also ungefähr so:
Gruß Barlee
das hört sich ja fast an, als wäre meine Abfrage für Deine Zwecke richtig.
Du musst nur das
Code: Alles auswählen
select * from ...
Code: Alles auswählen
select
Termine.[Spalte],
Termine.[Spalte],
Treffpunkt.[Spalte],
Typ.[Spalte]
from ...
Nein, das kannst Du Dir auch "zusammenklicken". Ich bevorzuge allerdings die direkte Eingabe. Aber da hat wohl jeder so seine Präferenzen...Muss man bei Base die SQL-codes generell selber eingeben?
Gruß Barlee
Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen
Hallo Thomas,
gern geschehen. Freut mich, wenn ich helfen konnte.
Allerdings handelt es sich in diesem Fall nicht um einen linken Verbund, sondern um einen INNER JOIN, den man auch so formulieren könnte:
zu linkem Verbund:
Gäbe es zu den Einträgen in der Tabelle "Termine" nicht immer einen entsprechenden Eintrag in der Tabelle "Orte", dann könntest Du mittels linkem Verbund (LEFT JOIN) alle Einträge aus der Tabelle "Termine" abfragen. Termine, zu denen kein Ort existiert, würden trotzdem angezeigt (NULL).
Gruß Barlee
gern geschehen. Freut mich, wenn ich helfen konnte.

Allerdings handelt es sich in diesem Fall nicht um einen linken Verbund, sondern um einen INNER JOIN, den man auch so formulieren könnte:
Code: Alles auswählen
SELECT *
FROM
Termine
INNER JOIN Typ ON Termine.TypID = Typ.ID
INNER JOIN Treffpunkt ON Termine.Ort = Treffpunkt.ID
Gäbe es zu den Einträgen in der Tabelle "Termine" nicht immer einen entsprechenden Eintrag in der Tabelle "Orte", dann könntest Du mittels linkem Verbund (LEFT JOIN) alle Einträge aus der Tabelle "Termine" abfragen. Termine, zu denen kein Ort existiert, würden trotzdem angezeigt (NULL).
Gruß Barlee