使用MySQL LEFT JOIN删除行

时间:2010-05-04 06:20:32

标签: mysql left-join delete-row sql-delete

我有两张桌子,一张用于工作截止日期,一张用于描述工作。每个作业都可以处于状态,一些状态意味着必须从另一个表中删除作业的截止日期。

我可以SELECT轻松LEFT JOIN符合我的条件的工作/截止日期:

SELECT * FROM `deadline`
LEFT JOIN `job` ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

status属于job表而不是deadline

但是当我想从deadline删除这些行时,MySQL会抛出错误。我的疑问是:

DELETE FROM `deadline`
LEFT JOIN `job`
ON deadline.job_id = job.job_id
WHERE `status` = 'szamlazva'
OR `status` = 'szamlazhato'
OR `status` = 'fizetve'
OR `status` = 'szallitva'
OR `status` = 'storno'

MySQL错误没有说明:

  

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在'left JOIN job附近使用正确的语法在deadline.job_id = job.job_id WHERE status ='szaml'在第1行

如何将SELECT转换为有效的DELETE查询?

6 个答案:

答案 0 :(得分:300)

您只需指定要应用DELETE的表。

仅删除deadline行:

DELETE `deadline` FROM `deadline` LEFT JOIN `job` ....

删除deadlinejob行:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` ....

仅删除job行:

DELETE `job` FROM `deadline` LEFT JOIN `job` ....

答案 1 :(得分:34)

如果您使用“table as”,请将其指定为删除。

在示例中,我删除了table_2中不存在的所有table_1行。

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL

答案 2 :(得分:2)

DELETE FROM deadline where ID IN (
    SELECT d.ID FROM `deadline` d LEFT JOIN `job` ON deadline.job_id = job.job_id WHERE `status` =  'szamlazva' OR `status` = 'szamlazhato' OR `status` = 'fizetve' OR `status` = 'szallitva' OR `status` = 'storno');

我不确定这种子查询是否适用于MySQL,但请尝试一下。我假设您在截止日期表中有一个ID列。

答案 3 :(得分:1)

尝试一下:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123

答案 4 :(得分:0)

MySQL允许您在DELETE语句中使用INNER JOIN子句从一个表中删除行,并在另一个表中删除匹配的行。

例如,要从满足指定条件的T1和T2表中删除行,请使用以下语句:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;

请注意,将表名T1和T2放在了DELETE和FROM关键字之间。如果省略T1表,则DELETE语句仅删除T2表中的行。同样,如果省略了T2表,则DELETE语句将仅删除T1表中的行。

希望获得帮助。

答案 5 :(得分:0)

这个脚本对我有用:

DELETE t
FROM table t
INNER JOIN join_table jt ON t.fk_column = jt.id
WHERE jt.comdition_column…;