2010-01-23 15 views
18

No estoy seguro de haber cometido un error de lógica.unión interna en valor nulo

Si tengo una consulta y hago una combinación interna con un valor nulo, ¿siempre obtendré resultados o ignorará la unión y tendrá éxito? ejemplo

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

si escribo y u.banStatus no recibiré filas?

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

¿Por qué no intentarlo? –

+1

NULL no está definido, por lo que si tenemos NULL = NULL, el resultado siempre será falso, ya que estamos comparando dos valores indefinidos. Espero que responda a su consulta –

+0

También hay un error en su consulta. El campo 'id' en su cláusula where es ambiguo, podría ser' u.id' o 'b.id'. –

Respuesta

6

Al hacer un INNER JOIN, NULL valores no coinciden con nada. Ni siquiera entre ellos. Es por eso que su consulta no devuelve ninguna fila. (Source)

44

No obtiene la fila si la unión es nula porque NULL no puede ser igual a nada, incluso NULL.

Si lo cambia a una UNIÓN IZQUIERDA, obtendrá la fila.

Con una combinación interna:

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

1, '1', 1, 'Banned' 

Con una combinación izquierda:

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

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

Usando estos datos de prueba:

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

no necesitaba datos de prueba ni nada que no fuera una conformación (sí, no obtendrá filas) pero es bueno para los lectores futuros. +1 y aceptar. –

5

Ésta es une un interior sobre los nulos (sintaxis de Oracle):

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

entonces esto se une cuando el usuario y bb son nulos? interesante. id nunca sería nulo o 0. Si escribo 'on uu.banstatus = bb.id o uu.banstatus es null', lo ignorará y se unirá y no me dará 0 filas? ¿Sería esto lo mismo que unirme a la izquierda? Interesante. Ya no necesito la respuesta, pero si quieres dar una, la leeré. –

+1

No, esto no se comportará como una combinación de la izquierda. Si 'bb.id' nunca es nulo, no habrá filas en el resultado con nulo' uu.banstatus'. –

+0

+1. Publicación interesante: D –

Cuestiones relacionadas