Query

如何檢查在另一個表中沒有具有某些特定值的條目的記錄?

  • October 31, 2018

例如,如果我們有兩個表:表 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

引用自:https://dba.stackexchange.com/questions/158569