2013-12-09 31 views
4

我想刪除它有另一個表 例如沒有現有的外鍵的所有行:刪除沒有ID存在於另一個表中的所有行

ID爲#20
table1 
+----+-------+ 
|id | data | 
+----+-------+ 
| 1 | hi | 
+----+-------+ 
| 2 | hi | 
+----+-------+ 
| 3 | hi | 
+----+-------+ 
| 4 | hi | 
+----+-------+ 
| 5 | hi | 
+----+-------+ 

table2 
+----+-------+ 
|a_id| data | 
+----+-------+ 
| 1 | hi | 
+----+-------+ 
| 20 | hi | 
+----+-------+ 
| 3 | hi | 
+----+-------+ 
| 40 | hi | 
+----+-------+ 
| 5 | hi | 
+----+-------+ 

查詢將刪除行桌子上有40個。

我需要這樣做,以便我可以建立與table1和table2的關係。

+1

'從表2中刪除ID不在(從Tab1中選擇ID)'? –

回答

11
DELETE table2 
FROM table2 
     LEFT JOIN table1 
       ON table2.a_id = table1.id 
WHERE table1.id IS NULL 
4

歸納起來,有樹的方式來刪除多表

  1. NOT IN(SELECT ...) - @someone(他已經刪除了他的答案)

    Delete From Tab2 where ID not in (Select ID From Tab1) 
    
  2. LEFT JOIN - @eggyal

    DELETE table2 
    FROM table2 LEFT JOIN table1 ON table2.a_id = table1.id 
    WHERE table1.id IS NULL 
    
  3. NOT EXISTS

    DELETE 
    FROM table2 
    WHERE NOT EXISTS (
        SELECT 1 
        FROM table1 
        WHERE table1.id = table2.a_id 
    ) 
    

根據What's the difference between NOT EXISTS vs. NOT IN vs. LEFT JOIN WHERE IS NULL?,不同RDBMS不同地執行。

+0

@eggyal謝謝。 –

相關問題