我在UPDATE脚本中完成了类似的JOIN,但我在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'
我可以这样做吗?
答案 0 :(得分:1)
MYSQL documentation非常清楚,是的,你可以做到这一点
您可以在a中指定多个表 DELETE语句从中删除行 一个或多个表取决于 WHERE中的特殊情况 条款。但是,您不能使用ORDER 多表中的BY或LIMIT 删除。 table_references子句 列出了连接中涉及的表。 它的语法在Section中描述 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中没有匹配, 使用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.
答案 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'
答案 2 :(得分:0)
作为一般答案,是的。如您所述,您可以使用条件加入第二个表,或者在子命令中拉出ID,如:
从T1删除 id in id in(SELECT id FROM T1 JOIN T2 ON X = Y WHERE T2.Val =“X”)
这有点重,但如果T2是孩子,你可以将其减少到:
(从T2 WHERE Val =“X”中选择Y)
有意义吗?