Должна ли таблица в предложении FROM быть в предложении WHERE? - PullRequest
1 голос
/ 01 февраля 2011

Я сделал аналогичное JOIN в скрипте UPDATE, но я использовал ту же таблицу в предложениях SET и WHERE.В этом сценарии DELETE мне нужно удалить из одной таблицы, где условие истинно в другой таблице.Например:

DELETE FROM `db_A`.`table_A`
JOIN `db_B`.`table_B`
ON `table_A`.`id` = `table_B`.`id`
WHERE `table_B`.`name`  = 'Remove Me'

Могу ли я сделать что-то подобное?

Ответы [ 3 ]

1 голос
/ 01 февраля 2011

В документации MYSQL очень ясно сказано, что да, вы можете сделать это

Вы можете указать несколько таблиц в Оператор DELETE для удаления строк из одна или несколько таблиц в зависимости от особое состояние в ГДЕ пункт. Тем не менее, вы не можете использовать ЗАКАЗАТЬ BY или LIMIT в нескольких таблицах УДАЛЯТЬ. Предложение table_references перечисляет таблицы, участвующие в объединении. Его синтаксис описан в разделе 12.2.8.1, «Синтаксис JOIN».

Для первого синтаксиса нескольких таблиц: только соответствующие строки из таблиц перечислены перед предложением FROM удален. Для второго мульти-стола синтаксис, только совпадающие строки из таблицы, перечисленные в предложении FROM (до предложения USING) удаляются. В результате вы можете удалять строки из многих таблиц одновременно и есть дополнительные таблицы, которые используются только для поиска:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

Или:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3
WHERE t1.id=t2.id AND t2.id=t3.id;

В этих утверждениях используются все три таблицы при поиске строк для удаления, но удалить совпадающие строки только из таблиц t1 и t2.

В предыдущих примерах используется INNER JOIN, но операторы DELETE с несколькими таблицами можно использовать другие типы разрешенного соединения в операторах SELECT, таких как LEFT ПРИСОЕДИНИТЬСЯ. Например, чтобы удалить строки, которые существуют в t1, которые не совпадают в t2, используйте левое соединение:

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL;
The syntax permits .* after each tbl_name for compatibility with Access.
0 голосов
/ 01 февраля 2011

Как общий ответ, да. Вы можете присоединиться ко второй таблице с условием, как вы заявили, или получить идентификаторы в подкоманде, например:

УДАЛИТЬ ОТ T1 ГДЕ ИДЕНТИФИКАТОР (ВЫБЕРИТЕ ИДЕНТИФИКАТОР ОТ T1 ПРИСОЕДИНЯЙТЕСЬ К Т2 ВКЛ. X = Y ГДЕ T2.Val = "X")

Это немного тяжелый вес, но если T2 - ребенок, вы можете уменьшить его до:

(ВЫБЕРИТЕ Y из T2, ГДЕ Val = "X")

Имеет смысл?

0 голосов
/ 01 февраля 2011

С Удалить вручную , таблица, которую вы хотите удалить, находится между DELETE и FROM. Если вы не хотите удалить из всех таблиц, участвующих в объединении

DELETE `db_A`.`table_A` FROM `db_A`.`table_A`
JOIN `db_B`.`table_B`
ON `table_A`.`id` = `table_B`.`id`
WHERE `table_B`.`name`  = 'Remove Me'
...