2011-07-03 159 views
4

我想清理一個表中有相當多的孤兒項目。刪除表中的孤兒

我正在通過查找空值來檢查是否存在與另一個表的關係。

DELETE FROM table1 
LEFT JOIN table2 ON table1.ID = table2.ID 
    WHERE table2.ID IS NULL 

我得到一個錯誤,左外連接無效。

我要尋找其他的方式,我可以從這個破碎的關係刪除這些孤兒

回答

10

試試這個建議:

DELETE FROM  table1 
WHERE NOT EXISTS (SELECT NULL FROM table2 WHERE table1.ID = table2.ID) 
+1

+1:你是第一個 –

17

如果你想使用相同的語法,這裏是它如何能已經:

DELETE a 
FROM table1 a 
LEFT JOIN table2 b 
ON a.id = b.id 
WHERE b.id IS NULL 
+0

我不明白爲什麼,但這比@MaziarTaheriAbkenar解決方案跑得快得多。 SQL Server中的查詢計劃與您的查詢計劃略有不同,但您的運行速度在我的世界中要快得多。 +1 –

+0

@Smitty奇怪,我會認爲這是一樣的 –

+2

這是做到這一點的方法。子查詢是這項工作的錯誤工具。 – Teson

0

表1應該是包含孤兒記錄的子表。和表2的父表。

DELETE ChildTable 
    FROM Table1 ChildTable  
    LEFT JOIN Table2 ParentTable 
    ON ChildTable.id = ParentTable.id 
    WHERE ParentTable.id IS NULL 

一個非常有幫助的文章。 SQL JOINs make it easy to find and fix missing data