Удалить записи, которых нет в соединении - PullRequest
4 голосов
/ 26 июня 2011

Представьте себе две таблицы (A и B):

A        B
1        2
2        3 
6        5 
4        7
9        11
         13
         23
         9 

Теперь я хочу удалить записи из A, которых нет в B, например, удаление 1, 6 и 4 из A.

Моя первоначальная идея состоит в том, что вы можете «отрицать» результаты объединения.

Ответы [ 3 ]

6 голосов
/ 26 июня 2011
DELETE FROM A WHERE NOT EXISTS (SELECT * FROM B WHERE A.id = B.id)

Я предположил, что эти столбцы названы id.

4 голосов
/ 26 июня 2011

Альтернатива ответу NOT EXISTS:

DELETE FROM A WHERE id NOT IN (SELECT id FROM b);

Опять при условии, что столбец назван id.

1 голос
/ 26 июня 2011

Вы можете найти несопоставленные записи, посмотрев значение NULL на одной стороне внешнего соединения, а затем удалите их:

DELETE FROM A
WHERE id IN
   (
   SELECT A.id
   FROM A
   LEFT JOIN B
   ON A.id = B.id
   WHERE B.id IS NULL  -- This means we only return unmatched A records
   )

Основная причина, по которой мне это нравится, заключается в том, что вы можете заранее выполнить часть SELECT оператора, чтобы проверить свою работу. В противном случае другие ответы выглядят намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...