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