web-dev-qa-db-ja.com

null値の内部結合

ロジックを間違えたかどうかはわかりません。

クエリがあり、null値で内部結合を行うと、常に結果が得られないか、結合を無視して成功しますか?例

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
21
user34537

結合がnullの場合、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');
49
Mark Byers

INNER JOINNULLの値は何とも一致しません。お互いにでも。これが、クエリが行を返さない理由です。 ( ソース

8
Daniel Vassallo

これはnullの内部結合です(Oracle構文)。

select *
  from user
       uu
  join banstatus
       bb
    on uu.banstatus = bb.id
       or
       uu.banstatus is null and bb.id is null
4
Vadim K.