Сценарий:
Допустим, у меня есть две таблицы, TableA и TableB. Первичный ключ TableB представляет собой один столбец (BId) и является столбцом внешнего ключа в TableA.
В моей ситуации я хочу удалить все строки в TableA, которые связаны с конкретными строками в TableB: можно ли это сделать с помощью объединений? Удалить все строки, которые извлекаются из объединений?
DELETE FROM TableA
FROM
TableA a
INNER JOIN TableB b
ON b.BId = a.BId
AND [my filter condition]
Или я вынужден сделать это:
DELETE FROM TableA
WHERE
BId IN (SELECT BId FROM TableB WHERE [my filter condition])
Причина, по которой я спрашиваю, состоит в том, что мне кажется, что первый вариант был бы гораздо более эффективным при работе с большими столами.
Спасибо!
DELETE TableA, TableB ...
и это фактически удалило соответствующие записи из обоих. Ницца.DELETE from TableA a using TableB b where b.Bid = a.Bid and [my filter condition]
DELETE a FROM TableA a INNER JOIN TableB b on b.Bid = a.Bid and [my filter condition]
Я бы использовал этот синтаксис
источник
Да, ты можешь. Пример :
источник
Пытался сделать это с базой данных доступа и обнаружил, что мне нужно использовать . * Сразу после удаления.
источник
Это почти то же самое в MySQL , но вы должны использовать псевдоним таблицы сразу после слова «УДАЛИТЬ»:
источник
Синтаксис выше не работает в Interbase 2007. Вместо этого мне пришлось использовать что-то вроде:
(Примечание. Interbase не поддерживает ключевое слово AS для псевдонимов).
источник
Я использую это
и способ @TheTXI достаточно хорош, но я прочитал ответы и комментарии и обнаружил, что нужно ответить на один вопрос - использовать условие в предложении WHERE или как условие соединения. Поэтому я решил проверить его и написать фрагмент кода, но не нашел значимой разницы между ними. Вы можете увидеть сценарий sql здесь, и важный момент заключается в том, что я предпочел написать его как commnet, потому что это не точный ответ, но он большой и не может быть помещен в комментарии, пожалуйста, извините.
Если вы могли бы получить вескую причину из этого скрипта или написать другую полезную, пожалуйста, поделитесь. Спасибо и надеюсь, что это поможет.
источник
Допустим, у вас есть 2 таблицы, одна с основным набором (например, сотрудники), а другая с дочерним набором (например, Dependents), и вы хотите избавиться от всех строк данных в таблице Dependents, которые не могут набрать ключ с любыми строками в мастер-таблице.
Здесь следует отметить, что вы сначала собираете «массив» EmpID из объединения, используя этот набор EmpID для выполнения операции удаления в таблице Dependents.
источник
В SQLite единственное, что работает, это что-то похожее на ответ beauXjames.
Кажется, это сводится к тому,
DELETE FROM table1 WHERE table1.col1 IN (SOME TEMPORARY TABLE);
что некоторые временные таблицы могут быть созданы с помощью SELECT и СОЕДИНЯТЬ две таблицы, которые вы можете отфильтровать по этой временной таблице, исходя из условия, что вы хотите удалить записи из таблицы Table1.источник
Вы можете запустить этот запрос: -
источник
Более простой способ:
источник
Минимизируйте использование запросов DML вместе с Joins. Вы должны быть в состоянии сделать большинство запросов DML с подзапросами, как описано выше.
В общем случае объединения следует использовать только тогда, когда вам нужно выбрать или выбрать столбцы в 2 или более таблицах. Если вы только касаетесь нескольких таблиц, чтобы определить совокупность, используйте подзапросы. Для запросов DELETE используйте коррелированный подзапрос.
источник