[英]Left outer join doesn't exclude when both the table have null values
我有一個要求,我必須提取左表獨有的數據。 我為此使用左外連接。 但是 output 提取的數據具有 null 值,用於兩個表中的連接條件中使用的變量,這是不期望的。 下面是詳細情況,
表A
ID | 姓名 | 主題 |
---|---|---|
1 | 湯姆 | 數學 |
2 | 傑克 | null |
表B
ID | 姓名 | 主題 |
---|---|---|
3 | 約翰 | 科學 |
2 | 傑克 | null |
詢問
SELECT *
FROM TableA
LEFT JOIN TableB
ON a.id = b.id
AND a.subject = b.subject
WHERE b.id IS NULL
AND b.subject IS NULL
預期 output
ID | 姓名 | 主題 |
---|---|---|
1 | 湯姆 | 數學 |
實際 output
ID | 姓名 | 主題 |
---|---|---|
1 | 湯姆 | 數學 |
2 | 傑克 | null |
問題是,在您的問題要求中,您似乎需要將null
視為等於(其他) null
。
這違背了null
的定義。 但是你可以達到你需要的結果——在加入條件下,改變
and a.subject = b.subject
至
and (a.subject = b.subject or (a.subject is null and b.subject is null))
在 Oracle 中,您可以更簡潔地執行此操作:
and decode (a.subject, b.subject, 1) = 1
因為故意定義decode
以將兩個null
視為“相等”。
如果需要,您可以對id
列執行相同操作 - 但假設它應該是兩個表中的主鍵,則不需要它。
編輯OP 聲稱建議使用decode
會產生錯誤的結果,而顯式使用or (a.subject is null and b.subject is null)
在 SQL Developer 上無限期地運行。 因此,在此編輯中,我將表明 OP 的主張都是錯誤的。 (我在我的 SQL Developer 副本上運行了所有內容,因此 IDE 不是問題。)
他在做什么,我們不知道,但是對於所提供的數據和給我們的查詢,這兩個建議都是 100% 正確的(在我們添加了 OP 查詢中缺少的表別名之后,我們 select 只是來自TableA
的數據)。
測試數據:
create table tablea (id, name, subject) as
select 1, 'tom' , 'math' from dual union all
select 2, 'jack', null from dual
;
create table tableb (id, name, subject) as
select 3, 'john', 'science' from dual union all
select 2, 'jack', null from dual
;
第一個查詢和結果:
SELECT a.*
FROM TableA a
LEFT JOIN TableB b
ON a.id = b.id
AND (a.subject = b.subject or (a.subject is null and b.subject is null))
WHERE b.id IS NULL
AND b.subject IS NULL
;
ID NAME SUBJECT
---------- ---- -------
1 tom math
第二次查詢和結果:
SELECT a.*
FROM TableA a
LEFT JOIN TableB b
ON a.id = b.id
AND decode(a.subject, b.subject, 1) = 1
WHERE b.id IS NULL
AND b.subject IS NULL
;
ID NAME SUBJECT
---------- ---- -------
1 tom math
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.