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