Внутреннее соединение с нулевым значением
Я не уверен, допустил ли я ошибку в логике.
Если у меня есть запрос, и я делаю внутреннее соединение с нулевым значением, я всегда получаю никаких результатов или проигнорирует соединение и преуспеет? Пример
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
Ответы
Ответ 1
Вы не получите строку, если соединение является нулевым, поскольку 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');
Ответ 2
Когда вы выполняете значения INNER JOIN
, NULL
не соответствуют ни с чем. Даже не друг с другом. Вот почему ваш запрос не возвращает никаких строк. (Источник)
Ответ 3
Это внутреннее объединение с нулями (синтаксис Oracle):
select *
from user
uu
join banstatus
bb
on uu.banstatus = bb.id
or
uu.banstatus is null and bb.id is null