inner join sur la valeur null
Je ne sais pas si j'ai fait une erreur dans la logique.
Si j'ai une question et je fais une jointure interne avec une valeur null serait je reçois toujours pas de résultats ou d'ignorer le rejoindre et de réussir? exemple
user { id PK, name NVARCHAR NOT NULL, banStatus nullable reference }
si j'écris et de l'u.banStatus je ne recevront pas de lignes?
select * from user as u
join banstatus as b on u.banStatus=b.id
where id=1
- Pourquoi ne pas essayer?
- NULL n'est pas défini, donc si nous avons NULL = NULL, alors le résultat sera toujours faux, comme nous de la comparaison de deux valeurs indéfinies. J'espère que cela répond à votre requête
- Il y a aussi une erreur dans votre requête. Le domaine
id
dans votre clause where est ambigu: il peut êtreu.id
oub.id
. - J'ai essayé une logique plus complexe de la version et de suspicion de problème. Ainsi écrit que le mannequin de la requête et ne se rendant pas compte de l'ambiguïté
Vous devez vous connecter pour publier un commentaire.
Vous n'obtenez pas la ligne si la partie est nulle, car NUL ne peut être égal à tout, même NULLE.
Si vous la changez pour une JOINTURE GAUCHE, puis vous obtiendrez la ligne.
Avec une jointure interne:
Avec un left join:
L'utilisation de ce test data:
Lorsque vous faites une
INNER JOIN
,NULL
valeurs ne correspondent pas avec n'importe quoi. Même pas les uns avec les autres. C'est pourquoi votre requête n'est pas de retourner toutes les lignes. (Source)C'est un des jointures internes sur les valeurs null (Oracle syntaxe):
on uu.banstatus = bb.id or uu.banstatus is null
il va l'ignorer et de le rejoindre et de ne pas me donner 0 lignes? serait-ce le même que left join? Intéressant. Je n'ai plus besoin de la réponse, mais si vous avez envie de donner, que je vais lire.bb.id
n'est jamais nulle, il n'y aura pas de lignes dans le résultat avec la valeur nulluu.banstatus
.and
etor
est bien défini, les premiers étant plus élevé. Je préfère de beaucoup le plus élevé de signal-à-bruit qui résulte d'éviter que de la syntaxe. Comme une question de principe, je n'aurais jamais écrire1 + (2 * 3)
pour clarifier ce que je veux dire par1 + 2 * 3
sur l'étrange hasard que quelqu'un sans une connaissance de base de l'arithmétique pourrait un jour essayer de donner un sens à mon code. Les romanciers ne pas abrutir leur prose pour rendre leur travail plus accessible à des lecteurs étrangers. De même, je ne devrais pas avoir de muets-bas mon code pour bénéficier de quelqu'un qui ne pouvait pas être pris la peine d'apprendre le SQL.