Tabelle joinen von zwei Fremdschlüsseln auf gleichen PK

Hallo zusammen,

ich habe mal wieder eine SQL-Frage. Ich möchte von Tabelle A eine Tabelle B joinen, und zwar von zwei Fremdschlüsseln in A auf den gleichen Primärschlüssel in B. Hier meine gekürzte Datenbankstruktur:

Datenbankstruktur:

Tabelle: bzo_routesegment
-----------------------------------
-routesegment_id INT PK AI
-routesegment_name VARCHAR(45)
-routesegment_startstation INT                    // der erste Fremdschlüssel
-routesegment_destinationstation INT          // der zweite Fremdschlüssel


Tabelle: bzo_station
-----------------------------------
-station_id INT PK AI                                    // auf dieses Feld zeigen die JOINS, das ist der erwähnte Primärschlüssel
-station_name VARCHAR(45)
-station_city INT

Ziel:
Ich möchte alle Streckenabschnitte auswählen und dabei auch die Namen (nicht nur die IDs) der Stationen bekommen.

Mein bisheriger Versuch in SQL:

      
SELECT s.routesegment_id, s.routesegment_name, s.routesegment_startstation, s.routesegment_destinationstation, startstation.station_name, destinationstation.station_name
FROM bzo_routesegment s 
LEFT JOIN bzo_station AS startstation ON s.routesegment_startstation = startstation.station_id 
LEFT JOIN bzo_station AS destinationstation ON s.routesegment_destinationstation = destinationstation.station_id;

Problem mit dem dargestellten Query: Die IDs der Start- und Zielstationen sind richtig, aber in den Result-Feldern beim Namen der Startstation steht der Name der Zielstation, und der Name der Zielstation ist leer.

Kann mir jemand helfen und meinen Query korrigieren? Liegt es an der Art des Joins?

Vielen Dank im Voraus,


Tim

Bist Du Dir sicher, daß die ID’s in der zweiten Tabelle auch alle vorkommen? Du hast in der ersten Tabelle nur als Kommentar genannt, daß das FK auf die bzo_station sein sollen, aber nicht so definiert. FAIL.

Ja, die FK-Definitionen sind da. (Das ganze ist eigentlich eine in MySQL-Designer angelegte DB und leider nicht PostgreSQL, weil es das auf dem Kundenserver nicht gibt. Die Foreign keys sind aber definiert und werden im DB-Diagramm auch angezeigt, auch wenn ich sie da oben nicht mit angegeben habe. Kommen sonst nicht auch SQL-Fehler statt einfach keine Ergebnisse?)

Du meinst also, sonst müsste der Query so richtig sein? Ist LEFT JOIN hier das richtige?

Daten sind drin auch welche da, mein SQL-Skript zum Einfügen von Testdaten lief laut PhpMyAdmin ohne Fehler durch, es enthält unter anderem folgende Zeilen:

...
INSERT INTO bzo_routesegment (routesegment_startstation, routesegment_destinationstation, routesegment_name) VALUES (4, 1, 'M nach F');
INSERT INTO bzo_routesegment (routesegment_startstation, routesegment_destinationstation, routesegment_name) VALUES (1, 2, 'F nach H');
INSERT INTO bzo_routesegment (routesegment_startstation, routesegment_destinationstation, routesegment_name) VALUES (2, 1, 'H nach F');
INSERT INTO bzo_routesegment (routesegment_startstation, routesegment_destinationstation, routesegment_name) VALUES (1, 4, 'F nach M');
INSERT INTO bzo_routesegment (routesegment_startstation, routesegment_destinationstation, routesegment_name) VALUES (1, 3, 'F nach B');
INSERT INTO bzo_routesegment (routesegment_startstation, routesegment_destinationstation, routesegment_name) VALUES (3, 1, 'B nach F');
...

Ich habe das Problem selbst gelöst. Die FKs und Daten waren ok, der Fehler war am Ende des SELECT-Teils im Query:

SELECT s.routesegment_id, s.routesegment_name, s.routesegment_startstation, s.routesegment_destinationstation, startstation.station_name, destinationstation.station_name...

Das Problem ist, dass die letzten beiden Felder in den gleichen Record 'station_name’ geschrieben werden. Man muss sie mit AS eindeutig benennen, es muss also heißen:

SELECT s.routesegment_id, s.routesegment_name, s.routesegment_startstation, s.routesegment_destinationstation, startstation.station_name AS startstation_name, destinationstation.station_name AS destinationstation_name...

Ich hätte ja irgendwie erwartet, dass sowas eine SQL-Warnung oder gar Fehlermeldung gibt…

Gruß,

Tim

Nun, erst einmal passiert dies:

test=# create table x(i int primary key, val text);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "x_pkey" for table "x"
CREATE TABLE
test=*# insert into x values (1,'eins');
INSERT 0 1
test=*# insert into x values (2,'zwei');
INSERT 0 1
test=*# create table y(val1 int references x, val2 int references x);
CREATE TABLE
test=*# insert into y values (1,2);
INSERT 0 1
test=*# select x1.val, x2.val from y left join x x1 on y.val1=x1.i left join x x2 on y.val2=x2.i;
 val  | val
------+------
 eins | zwei
(1 row)

Das ist IMHO immer noch richtig. Problem ist aber, wenn Du mit einem Client hier das Feld namens ‘val’ auslesen willst. Welches Schweinchen hätten’s gern?

Ja, du hast Recht.

(Und die Warnung würde ich natürlich bei der Suchanfrage des Clients erwarten und nicht etwa beim Erstellen der Tabelle.)