Подтвердить что ты не робот

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

Кажется, я не помню этот запрос!

Я хочу удалить все строки в таблице1, идентификаторы которых совпадают с ID2.

Итак:

DELETE table1 t1
 WHERE t1.ID = t2.ID

Я знаю, что могу делать идентификатор WHERE (SELECT ID FROM table2), но я хочу сделать этот запрос, используя JOIN, если это возможно.

4b9b3361

Ответ 1

DELETE Table1
FROM Table1
INNER JOIN Table2 ON Table1.ID = Table2.ID

Ответ 2

DELETE t1 
FROM Table1 t1
JOIN Table2 t2 ON t1.ID = t2.ID;

Я всегда использую псевдоним в инструкции delete, поскольку он предотвращает случайный

DELETE Table1 

вызвано, если вы не выделили весь запрос перед его запуском.

Ответ 3

В ANSI SQL нет решения использовать объединения при удалении AFAIK.

DELETE FROM Table1
WHERE Table1.id IN (SELECT Table2.id FROM Table2)

Позже отредактируйте

Другое решение (иногда выполняется быстрее):

DELETE FROM Table1
WHERE EXISTS( SELECT 1 FROM Table2 Where Table1.id = Table2.id)

Ответ 4

Реализация PostgreSQL будет:

DELETE FROM t1
USING t2
WHERE t1.id = t2.id;

Ответ 5

Попробуйте следующее:

DELETE Table1
FROM Table1 t1, Table2 t2
WHERE t1.ID = t2.ID;

или

DELETE Table1
FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;

Ответ 6

Я думаю, что вы можете получить немного большую производительность, если попробуете этот

DELETE FROM Table1
WHERE EXISTS (
  SELECT 1
  FROM Table2
  WHERE Table1.ID = Table2.ID
)

Ответ 7

Это приведет к удалению всех строк в Table1, которые соответствуют критериям:

DELETE Table1 
FROM Table2 
WHERE Table1.JoinColumn = Table2.JoinColumn And Table1.SomeStuff = 'SomeStuff'

Ответ 8

Обнаружено ссылка полезная

Скопировано оттуда

Зачастую требуется удалить некоторые записи из таблицы на основе критериев в другой таблице. Как удалить из одной из этих таблиц без удаления записей в обеих таблицах?

DELETE DeletingFromTable
     FROM DeletingFromTable INNER JOIN CriteriaTable
     ON DeletingFromTable.field_id = CriteriaTable.id
     WHERE CriteriaTable.criteria = "value";

Ключ в том, что вы указываете имя удаляемой таблицы, как SELECT. Таким образом, JOIN и WHERE делают выбор и ограничение, в то время как DELETE делает удаление. Тем не менее, вы не ограничены только одной таблицей. Если у вас есть отношения "многие ко многим" (например, "Журналы и подписчики", подключенные подпиской), и вы удаляете подписчика, вам также необходимо удалить любые потенциальные записи из модели объединения.

 DELETE subscribers, subscriptions
     FROM subscribers INNER JOIN subscriptions 
       ON subscribers.id = subscriptions.subscriber_id
     INNER JOIN magazines 
       ON subscriptions.magazine_id = magazines.id
     WHERE subscribers.name='Wes';

Удаление записей с соединением также может быть выполнено с помощью LEFT JOIN и WHERE, чтобы увидеть, была ли объединенная таблица NULL, чтобы вы могли удалять записи в одной таблице, которая не имела соответствия (например, при подготовке к добавлению отношения.) Пример после.

Ответ 9

Поскольку OP не запрашивает конкретную БД, лучше используйте стандартную совместимую инструкцию. Только MERGE находится в стандарте SQL для удаления (или обновления) строк при присоединении к целевой таблице.

merge table1 t1
    using (
        select t2.ID
            from table2 t2
    ) as d
    on t1.ID = d.ID
    when matched then delete;

MERGE имеет более строгую семантику, защищая от некоторых ошибок, которые могут остаться незамеченными с помощью DELETE ... FROM. Он обеспечивает "уникальность" соответствия: если многие строки в источнике (оператор внутри using) соответствуют одной и той же строке в целевом объекте, слияние должно быть отменено и ошибка должна быть вызвана движком SQL.

Ответ 10

Ссылка MSDN T-SQL DELETE (пример D):

DELETE FROM Table1
FROM Tabel1 t1
   INNER JOIN Table2 t2 on t1.ID = t2.ID

Ответ 11

Чтобы удалить записи таблицы на основе другой таблицы

     Delete From Table1 a,Table2 b where a.id=b.id

    Or

      DELETE FROM Table1
    WHERE Table1.id IN (SELECT Table2.id FROM Table2)

  Or

        DELETE Table1
     FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID = t2.ID;

Ответ 12

Это старый, я знаю, но просто указатель на любого, кто использует эту задницу ссылку. Я только что попробовал это, и если вы используете Oracle, JOIN не работает в операторах DELETE. Появится следующее сообщение:

ORA-00933: команда SQL не была закончена.

Ответ 13

В то время как OP не хочет использовать оператор 'in', в ответ на Ankur Gupta, это был самый простой способ, который я нашел, чтобы удалить записи в одной таблице, которых не было в другой таблице, в одном для многих отношений:

DELETE
FROM Table1 as t1
WHERE ID_Number NOT IN
(SELECT ID_Number FROM Table2 as t2)

Работала как прелесть в Access 2016, для меня.

Ответ 14

Я часто делаю такие вещи, как следующий приведенный пример. (Этот пример из Informix SE работает в Linux.)

Пункт этого примера состоит в том, чтобы удалить все транзакции транзакций с освобождением/сокращением выбросов, поскольку приложение для борьбы с загрязнением имеет ошибку, основанную на информации в таблице real_estate.

В этом случае last_update != null означает, что учетная запись не закрыта, а res_exempt != 'p' означает, что учетные записи не являются личным имуществом (торговое оборудование/оборудование).

delete from trans 
where   yr = '16'
and     tran_date = '01/22/2016'
and     acct_type = 'r'
and     tran_type = 'a'
and     bill_no in
(select acct_no from real_estate where last_update is not null
 and res_exempt != 'p');

Мне нравится этот метод, потому что критерии фильтрации - по крайней мере, для меня - легче читать при создании запроса и понимать много месяцев спустя, когда я смотрю на него и задаюсь вопросом, о чем я думал.

Ответ 15

delete
    table1
from 
    t2
where
    table1.ID=t2.ID

Работает на mssql