簡體   English   中英

選擇不在另一個表中的行

[英]Select rows not in another table

SELECT DISTINCT a.value
FROM a LEFT JOIN b 
    ON a.value = b.value 
      AND (b.field IS NULL OR b.field != 'my_string');

SELECT a.value
FROM a
WHERE a.value NOT IN
    (SELECT value 
     FROM b
     WHERE b.field = 'my_string');

根據我的閱讀,進行左聯接更快。 但是我也讀過DISTINCT是低效率查詢的代碼味道。 在最壞的情況下,如何確定哪個查詢的性能更好?

編輯:對不起,id不是主鍵,它只是另一個字段。 我將其替換為價值。

EDIT2:好像每個人都掛斷了我的第一個查詢。 假設它看起來像這樣。 邏輯不一樣嗎?

SELECT DISTINCT a.value
FROM a LEFT JOIN b ON a.value = b.value 
WHERE (b.field IS NULL OR b.field != 'my_string');

EDIT3:樣本小提琴。 http://sqlfiddle.com/#!2/500ea/1

EDIT4:接受的答案。 http://sqlfiddle.com/#!2/500ea/8

您的第一次加入是荒謬的。 它返回所有a.id中值a 請記住, left join將所有行保留在第一個表中,並將匹配的行保留在第二個表中。 我認為您打算:

SELECT a.id
FROM a LEFT JOIN
     b 
     ON a.id = b.id AND b.field = 'my_string'
WHERE b.field IS NULL;

假設a.id是唯一的ID,則該distinct是不必要的。

一種替代方法是使用not exists

SELECT a.id
FROM a
WHERE NOT EXISTS (SELECT 1 FROM b WHERE a.id = b.id AND b.field = 'my_string');

為了提高性能,請在b(id, field)上創建一個索引。

通常, NOT IN (SELECT ...)LEFT JOIN效率更高,因為IN()條件中的SELECT必須為每行執行一次才能執行過濾器。 對於小型數據集,這不是問題,但是對於大型數據集,這可能是 一個很大的麻煩, 而且效率很低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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