Query
如何檢查在另一個表中沒有具有某些特定值的條目的記錄?
例如,如果我們有兩個表:表 1 和表 2
Table1 - 主表(所有記錄的唯一條目) table2 - 是一個歷史表(其中包含基於時間戳的同一記錄的許多條目)(還包含一些特定的欄位類型)
我需要檢索數據,例如 table1 中的所有數據,其中沒有 type = ‘Some vaue’ 的記錄條目
我通常將其寫為 NOT EXISTS 查詢,因為這與問題的措辭一致(“在 table1 中查找 table2 中不存在相應行的所有內容”)
select t1.* from table1 t1 where not exists (select * from table2 t2 where t1.id = t2.table1_id and type = 'Some Value');
根據您的 DBMS,mcNets 的解決方案可能會更快——這在很大程度上取決於查詢優化器,例如在 Oracle 中它不會有任何區別。
基本上,您可以使用 LEFT JOIN 從 table1 獲取所有記錄,然後使用 IS NULL 和 IS NOT NULL 來獲取 table2 中所有現有和不存在的相關值。
SELECT table1.id FROM table1 LEFT JOIN table2 ON table2.table1_id = table2.id WHERE table2.table1.id is null
您還可以使用 GROUP BY 和 COUNT() > 0 或 COUNT() = 0
SELECT table1.id, count(table2.table1_id) as records_in_table2 FROM table1 LEFT JOIN table2 ON table2.table1_id = table1.id GROUP BY table1.id HAVING COUNT(table2.table1_id) > 0