FROM子句中的表必须在WHERE子句中吗?

时间:2011-02-01 17:38:34

标签: mysql sql join sql-delete

我在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'

我可以这样做吗?

3 个答案:

答案 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开始,您要删除的表格位于DELETEFROM之间。除非您想要从连接中涉及的所有表中删除

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)

有意义吗?