Как удалить элементы из одной таблицы из другой? - PullRequest
4 голосов
/ 20 декабря 2008

У меня есть таблицы A и B. Элементы таблицы B могут также существовать в таблице A, и я хочу удалить эти элементы. Как бы выглядели операторы SQL для этого?

Ответы [ 8 ]

6 голосов
/ 20 декабря 2008

это опция

delete from a
where a.key in (select key from b)
3 голосов
/ 20 декабря 2008

Или:

DELETE a
WHERE a.some_field IN (SELECT some_field FROM b)

или

DELETE A
WHERE EXISTS (SELECT 1 FROM b WHERE b.field1 = a.field2)

В зависимости от вашей базы данных, вы можете обнаружить, что одна из них работает лучше других. Oracle IIRC предпочитает, ГДЕ СУЩЕСТВУЕТ IN, но это может зависеть от ряда факторов.

2 голосов
/ 20 декабря 2008

В некоторых БД довольно экзотически выглядящий DELETE FROM FROM очень эффективный

delete from foo from foo as f
where exists 
(
  select 1 from bar as b  where b.field = f.field
) 
2 голосов
/ 20 декабря 2008

Что-то вроде:

DELETE 
FROM TableA as A 
WHERE A.ID IN (SELECT ID 
               FROM TableB AS B 
               WHERE [your condition here])
1 голос
/ 20 декабря 2008

Это разрешено в соответствии со стандартом.

delete a from a join b on a.id = b.id;
1 голос
/ 20 декабря 2008

Если ваши таблицы используют InnoDB, самый простой способ - настроить таблицу A с внешними ключами из таблицы B и использовать ON DELETE CASCADE. Таким образом, никаких изменений кода не требуется, и целостность вашей базы данных гарантирована.

0 голосов
/ 20 декабря 2008
DELETE FROM FIRST_TABLE FT
WHERE EXISTS(
            SELECT 1
            FROM SECOND_TABLE ST
            WHERE ST.PRIMARY_KEY = FT.PRIMARY_KEY
            );
0 голосов
/ 20 декабря 2008
delete a
--select a.*
from tablea a
join tableb b on a.someid = b.someid

Убедитесь, что сначала вы запустили выбранную часть, чтобы убедиться, что вы получаете нужные записи.

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