2011-02-01 137 views
1

我在UPDATE腳本中做了一個類似的JOIN,但我在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

...你試過了嗎? – 2011-02-01 17:41:40

回答

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' 
1

MYSQL documentation非常清楚,是的,你可以做到這一點

您可以在 DELETE語句刪除行指定多個表從 一個或多個表,具體取決於WHERE 子句中的特定條件。但是,您不能在多表 DELETE中使用ORDER 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 JOIN聯接允許 。例如,要刪除 在T1中存在有對T沒有匹配行, 使用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

作爲一個籠統的回答,是的。您可以按照您的說明將條件加入第二個表格,或者在子命令中拉出ID,例如:

DELETE FROM T1 WHERE id in(SELECT id FROM T1 JOIN T2 ON X = Y WHERE T2 。瓦爾= 「X」)

這是一個有點沉重的重量,但如果T2是孩子,可以將此減少到:

(從T2選擇Y其中val = 「X」)

合理?