2010-01-23 13 views
18

Ich bin mir nicht sicher, ob ich einen Fehler in der Logik gemacht habe.Inner Join auf Nullwert

Wenn ich eine Abfrage habe und ich einen inneren Join mit einem Null-Wert mache, würde ich immer keine Ergebnisse erhalten oder wird der Join ignoriert und gelingen? Beispiel

user { id PK, name NVARCHAR NOT NULL, banStatus nullable reference } 

Wenn ich schreibe und u.banStatus ich werde keine Zeilen erhalten?

select * from user as u 
join banstatus as b on u.banStatus=b.id 
where id=1 
+0

Warum nicht einfach versuchen? –

+1

NULL ist nicht definiert. Wenn NULL = NULL ist, ist das Ergebnis immer falsch, da wir zwei undefinierte Werte vergleichen. Ich hoffe, es beantwortet Ihre Anfrage –

+0

Es gibt auch einen Fehler in Ihrer Abfrage. Das Feld "id" in Ihrer where-Klausel ist mehrdeutig - es könnte "u.id" oder "b.id" sein. –

Antwort

6

Wenn Sie das tun ein INNER JOIN, NULL Werte nicht mit etwas übereinstimmen. Nicht einmal miteinander. Aus diesem Grund gibt Ihre Abfrage keine Zeilen zurück. (Source)

44

Sie erhalten die Zeile nicht, wenn der Join null ist, da NULL nicht gleich sein kann, auch NULL.

Wenn Sie es in einen LINKEN JOIN ändern, dann erhalten Sie die Zeile.

mit einem inneren JOIN:

select * from user as u 
join banstatus as b on u.banStatus=b.id 

1, '1', 1, 'Banned' 

mit einem linken JOIN:

select * from user as u 
left join banstatus as b on u.banStatus=b.id 

1, '1', 1, 'Banned' 
2, 'NULL', , '' 

diese Testdaten:

CREATE TABLE user (id int, banstatus nvarchar(100)); 
INSERT INTO user (id, banstatus) VALUES 
(1, '1'), 
(2, 'NULL'); 

CREATE TABLE banstatus (id int, text nvarchar(100)); 
INSERT INTO banstatus (id, text) VALUES 
(1, 'Banned'); 
+2

Ich brauchte keine Testdaten oder irgendetwas anderes als eine Konformation (ja, Sie werden keine Zeilen bekommen), aber gut für zukünftige Leser. + 1 & akzeptieren. –

5

Dies ist ein inneres auf nulls verbindet (Oracle Syntax):

select * 
    from user 
     uu 
    join banstatus 
     bb 
    on uu.banstatus = bb.id 
     or 
     uu.banstatus is null and bb.id is null 
+0

so verbindet sich, wenn Benutzer und bb null sind? interessant. id wäre niemals null oder 0. Wenn ich 'on uu.banstatus = bb.id oder uu.banstatus is null 'geschrieben habe, wird es ignoriert und beitreten und mir keine 0 Zeilen geben? wäre das das gleiche wie links beitreten? Interessant. Ich brauche die Antwort nicht mehr, aber wenn du Lust hast, einen zu geben, lese ich. –

+1

Nein, das wird sich nicht wie ein linker Join verhalten. Wenn 'bb.id' niemals null ist, wird es im Ergebnis keine Zeilen mit null 'uu.banstatus' geben. –

+0

+1. Interessanter Beitrag: D –