2011-02-01 2 views
1

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

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

Могу ли я сделать что-то вроде этого?

+1

... Вы пробовали? –

ответ

0

От Delete Manual таблица, которую вы хотите удалить, находится между 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' 
1

MYSQL documentation делает его очень ясно, что да, вы можете сделать это

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

Для первого синтаксиса множественного таблицы, только соответствующие строки из таблиц, перечисленных перед ЕКОМ являются удалены. Для второго синтаксиса с несколькими таблицами сопоставляются только строки из таблиц , перечисленных в предложении 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.

Приведенные выше примеры используют внутреннее соединение, но многотабличные ВЕЬЕТЕ можно использовать другие типы присоединиться разрешено в ЗЕЬЕСТ, таких как ЛЕВЫЙ Объединить. Например, для удаления строк, которые существуют в t1, которые не имеют аналогов в t2, используйте LEFT JOIN:

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

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

УДАЛИТЬ ОТ T1 ГДЕ id (SELECT id FROM T1 JOIN T2 ON X = Y WHERE T2 ,Val = "X")

Это тяжелый вес немного, но если Т2 ребенок, вы можете уменьшить это:

(SELECT Y от T2 WHERE Val = "X")

Имеют смысл?

Смежные вопросы