簡體   English   中英

當兩個表都有 null 值時,左外連接不排除

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM