внутреннее соединение с нулевым значением - PullRequest
20 голосов
/ 23 января 2010

Я не уверен, что ошибся в логике.

Если у меня есть запрос и я выполняю внутреннее соединение с нулевым значением, я всегда получу никаких результатов, или оно проигнорирует соединение и преуспеет? Пример

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

если я напишу и u.banStatus я не получу строк?

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

Ответы [ 3 ]

48 голосов
/ 23 января 2010

Вы не получите строку, если соединение равно нулю, потому что NULL не может быть равным чему-либо, даже NULL.

Если вы измените его на LEFT JOIN, вы получите строку.

с внутренним соединением:

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

1, '1', 1, 'Banned'

с левым соединением:

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

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

Используя эти данные теста:

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');
8 голосов
/ 23 января 2010

Когда вы вводите значения INNER JOIN, NULL не совпадают ни с чем. Даже не друг с другом. Вот почему ваш запрос не возвращает никаких строк. ( Источник )

5 голосов
/ 24 января 2010

Это внутреннее соединение по нулям (синтаксис Oracle):

select *
  from user
       uu
  join banstatus
       bb
    on uu.banstatus = bb.id
       or
       uu.banstatus is null and bb.id is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...