Linker Verbund, Fehler in Abfragen ab drei Tabellen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Scharschi
*
Beiträge: 11
Registriert: Mi, 11.10.2006 10:52
Wohnort: Ilmenau

Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Scharschi »

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.
Adresse.jpg
Adresse.jpg (36.58 KiB) 2207 mal betrachtet
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.
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Barlee »

Hallo Scharschi,

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"
Gruss Barlee
Scharschi
*
Beiträge: 11
Registriert: Mi, 11.10.2006 10:52
Wohnort: Ilmenau

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Scharschi »

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?
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Barlee »

Hallo Thomas,

kannst Du Deine Abfrage hier einmal reinkopieren.
Über den Grund des beschriebenen Fehlers kann man sonst nur spekulieren.

Gruß Barlee
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Barlee »

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
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Barlee »

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

Code: Alles auswählen

select * from Termine, Typ, Treffpunkt
where Termine.TypID = Typ.ID
and Termine.Ort = Treffpunkt.ID
Gruß Barlee
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Barlee »

Hallo Thomas,

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 ...
durch die Spalten ersetzen, die Du in der Ergebnistabelle haben willst. Also ungefähr so:

Code: Alles auswählen

select
Termine.[Spalte],
Termine.[Spalte],
Treffpunkt.[Spalte],
Typ.[Spalte]
from ...
Muss man bei Base die SQL-codes generell selber eingeben?
Nein, das kannst Du Dir auch "zusammenklicken". Ich bevorzuge allerdings die direkte Eingabe. Aber da hat wohl jeder so seine Präferenzen...


Gruß Barlee
Barlee
******
Beiträge: 767
Registriert: Sa, 17.12.2005 12:27

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Beitrag von Barlee »

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:

Code: Alles auswählen

SELECT *
FROM 
Termine
INNER JOIN  Typ ON Termine.TypID = Typ.ID
INNER JOIN Treffpunkt ON Termine.Ort = Treffpunkt.ID
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
Antworten