Linker Verbund, Fehler in Abfragen ab drei Tabellen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Linker Verbund, Fehler in Abfragen ab drei Tabellen

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

von Barlee » Mo, 10.12.2007 20:26

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

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

von Barlee » Fr, 07.12.2007 20:33

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

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

von Barlee » Do, 06.12.2007 19:06

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

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

von Barlee » Mi, 05.12.2007 20:27

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

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

von Barlee » Di, 04.12.2007 19:29

Hallo Thomas,

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

von Scharschi » Mi, 11.07.2007 21:21

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?

Re: Linker Verbund, Fehler in Abfragen ab drei Tabellen

von Barlee » Mi, 11.07.2007 21:02

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

Linker Verbund, Fehler in Abfragen ab drei Tabellen

von Scharschi » Mi, 11.07.2007 16:56

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) 2210 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

Nach oben