Удалить все строки, у которых нет идентификатора, существующего в другой таблице

Я хочу удалить все строки, у которых нет внешнего ключа в другом примере таблицы:

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    |
+----+-------+

Запрос удалит строки с идентификаторами 20 и 40 в таблице 2.

Мне нужно сделать это, чтобы установить связь с table1 и table2.


person Lawrence Boadilla    schedule 09.12.2013    source источник


Ответы (1)


Подводя итог, есть три способа удалить несколько таблиц.

  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
    )
    

Согласно В чем разница между NOT EXISTS, NOT IN и LEFT JOIN WHERE IS NULL?, разные СУБД работают по-разному.

person Jason Heo    schedule 09.12.2013