Hallo zusammen.
Ich habe ein seltsames Problem bei LEFT JOINS. Diese liefern bei mir für eine Zeile einmal den gewünschten Wert zurück und zusätzlich eine identische Zeile nur mit einem NULL Eintrag bei dem gewünschten Wert.
Ich habe die Folgenden Tabellen:
STATE (speichert einen State mit id und einem namen)
id | name
0 | c
1 | a
2 | b
AUTOMAT (speichert einen Automaten mit id und einem namen)
id | name
0 | foo
AUT_STATE (speichert die ids der Automaten und die dazugehörigen State ids, die in diesem liegen)
aut | state
0 | 1
0 | 2
VIEW_AUT_STATE (eine view die bis jetzt nicht viel macht, sondern nur states automaten zuordnet. Der Sinn sei hier mal nicht so wichtig)
id | aut | state
0 | 0 | 1
1 | 0 | 2
Nun habe ich ein Query das alle Elemente aus VIEW_AUT_STATE selektiert und noch eine neue Spalte einfügt für andere mögliche States die in dem Automaten liegen. Dabei soll die id von state und state2 nicht identisch sein. Und state2 soll den namen "b" haben
SELECT DISTINCT v.*, s.id AS state2
FROM VIEW_AUT_STATE AS v
LEFT JOIN AUT_STATE AS as ON as.aut = v.aut
LEFT JOIN STATE AS s ON v.state != s.id AND
as.aut = v.aut AND
as.state= s.id AND
s.name = "b";
Nun bekomme ich als Ergebnis:
id | aut | state | state2
0 | 0 | 1 | NULL
0 | 0 | 1 | 2
1 | 0 | 2 | NULL
Wie kann es sein, dass ich für die 1. Zeile in VIEW_AUT_STATE (0 | 0 | 1) zwei Einträge bekomme?
Einen mit dem Wert, den ich erwartet hätte (2) und einmal mit NULL.
Soweit ich LEFT JOINS verstanden habe, wird nur dann mit NULL aufgefüllt, wenn es für diese Spalte kein valides Element gibt. Hier jedoch ist die 2 valide und trotzdem bekomme ich die Zeile mit NULL.
Das Ergebnis was ich also erwartet hätte, ist:
id | aut | state | state2
0 | 0 | 1 | 2
1 | 0 | 2 | NULL
Hat jemand eine Idee was ich hier falsch mache?
Ich habe ein seltsames Problem bei LEFT JOINS. Diese liefern bei mir für eine Zeile einmal den gewünschten Wert zurück und zusätzlich eine identische Zeile nur mit einem NULL Eintrag bei dem gewünschten Wert.
Ich habe die Folgenden Tabellen:
STATE (speichert einen State mit id und einem namen)
id | name
0 | c
1 | a
2 | b
AUTOMAT (speichert einen Automaten mit id und einem namen)
id | name
0 | foo
AUT_STATE (speichert die ids der Automaten und die dazugehörigen State ids, die in diesem liegen)
aut | state
0 | 1
0 | 2
VIEW_AUT_STATE (eine view die bis jetzt nicht viel macht, sondern nur states automaten zuordnet. Der Sinn sei hier mal nicht so wichtig)
id | aut | state
0 | 0 | 1
1 | 0 | 2
Nun habe ich ein Query das alle Elemente aus VIEW_AUT_STATE selektiert und noch eine neue Spalte einfügt für andere mögliche States die in dem Automaten liegen. Dabei soll die id von state und state2 nicht identisch sein. Und state2 soll den namen "b" haben
SELECT DISTINCT v.*, s.id AS state2
FROM VIEW_AUT_STATE AS v
LEFT JOIN AUT_STATE AS as ON as.aut = v.aut
LEFT JOIN STATE AS s ON v.state != s.id AND
as.aut = v.aut AND
as.state= s.id AND
s.name = "b";
Nun bekomme ich als Ergebnis:
id | aut | state | state2
0 | 0 | 1 | NULL
0 | 0 | 1 | 2
1 | 0 | 2 | NULL
Wie kann es sein, dass ich für die 1. Zeile in VIEW_AUT_STATE (0 | 0 | 1) zwei Einträge bekomme?
Einen mit dem Wert, den ich erwartet hätte (2) und einmal mit NULL.
Soweit ich LEFT JOINS verstanden habe, wird nur dann mit NULL aufgefüllt, wenn es für diese Spalte kein valides Element gibt. Hier jedoch ist die 2 valide und trotzdem bekomme ich die Zeile mit NULL.
Das Ergebnis was ich also erwartet hätte, ist:
id | aut | state | state2
0 | 0 | 1 | 2
1 | 0 | 2 | NULL
Hat jemand eine Idee was ich hier falsch mache?