从一个带有连接的表中删除

Jul*_*ung 33 mysql left-join sql-delete

我正在尝试根据另一个数据库的选择标准从一个数据库中删除记录.我们有两个表,emailNotification,用于存储作业和电子邮件列表.然后我们有工作.我想清除已关闭的作业的电子邮件通知.我在Stackoverflow上发现了一些早期的例子,它们引导我使用这种语法(我之前尝试在where之前进行连接).

DELETE FROM emailNotification
WHERE notificationId IN (
 SELECT notificationId FROM emailNotification e
 LEFT JOIN jobs j ON j.jobId = e.jobId
WHERE j.active = 1
)
Run Code Online (Sandbox Code Playgroud)

我收到错误,您无法在FROM子句中指定目标表'emailNotication'以进行更新.

Nav*_*ved 86

我不确定你的要求.我从您的问题中理解的是,您要删除已关闭的所有作业的电子邮件.尝试这个;

DELETE e FROM emailNotification e 
LEFT JOIN jobs j ON j.jobId = e.jobId 
WHERE j.active = 1 AND CURDATE() < j.closeDate
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案.这里很微妙的是你必须在DELETE关键字之后包含表别名.我之前从未这样做过,但我想当你在删除语句中有一个JOIN时,这是必要的. (9认同)
  • 当您编写类似"DELETE e,j FROM ..."的内容时,您还可以从作业表"j"中删除匹配的行.请参阅[此处](http://www.mysqltutorial.org/mysql-delete-join/ ) (3认同)

Ama*_*arg 8

MySQL使用JOIN删除记录

使用单个查询从多个表中删除多个记录如下:

通常在SELECT语句中使用INNER JOIN从表中选择具有其他表中相应记录的记录.我们还可以使用带有DELETE语句的INNER JOIN子句来删除表中的记录以及其他表中的相应记录,例如,要删除满足特定条件的T1和T2表中的记录,请使用以下语句:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition
Run Code Online (Sandbox Code Playgroud)

请注意,您将表名T1和T2放在DELETE和FROM之间.如果省略T1表,则DELETE语句仅删除T2表中的记录,如果省略T2表,则仅删除T1表中的记录.

join条件T1.key = T2.key指定T2表中需要删除的相应记录.

WHERE子句中的条件指定需要删除T1和T2中的哪些记录.