Подтвердить что ты не робот

Внутреннее соединение с нулевым значением

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

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

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
4b9b3361

Ответ 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