2010-01-23 14 views
18

Non sono sicuro di aver fatto un errore di logica.inner join su valore nullo

Se ho una query e faccio un inner join con un valore null, non otterrò mai risultati o ignorerà il join e riuscirà? esempio

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

se scrivo e u.banStatus non riceverò righe?

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

Perché non provarlo? –

+1

NULL non è definito, quindi se abbiamo NULL = NULL il risultato sarà sempre falso, poiché stiamo confrontando due valori non definiti. Spero che risponda alla tua domanda –

+0

C'è anche un errore nella tua richiesta. Il campo 'id' nella tua clausola where è ambiguo - potrebbe essere' u.id' o 'b.id'. –

risposta

6

Quando si esegue un INNER JOIN, NULL valori non corrispondono con qualsiasi cosa. Neanche tra loro. Questo è il motivo per cui la tua query non restituisce alcuna riga. (Source)

44

Non si ottiene la riga se il join è nullo perché NULL non può essere uguale a nulla, anche NULL.

Se lo si cambia in SINISTRA SINISTRA, si otterrà la riga.

Con un inner join:

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

1, '1', 1, 'Banned' 

Con un LEFT JOIN:

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

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

Utilizzando questi dati di test:

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

non ho avuto bisogno di dati di test o di qualsiasi altra cosa di una conformazione (sì, non otterrai righe), ma va bene per i futuri lettori. + 1 e accettare. –

5

Questo è un inner join su valori nulli (sintassi Oracle):

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

quindi questo si unisce quando utente e bb sono nulli? interessante. id non sarebbe mai nullo o 0. Se ho scritto 'su uu.banstatus = bb.id o uu.banstatus è nullo' lo ignorerà e si unirà e non mi darà 0 righe? sarebbe uguale a sinistra join? Interessante. Non ho più bisogno della risposta, ma se hai voglia di dargliene uno leggerò. –

+1

No, questo non si comporta come un join di sinistra. Se 'bb.id' non è mai nullo, non ci saranno righe nel risultato con null' uu.banstatus'. –

+0

+1. Post interessante: D –