首页 文章

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

提问于
浏览
31

我正在尝试根据另一个数据库的选择标准从一个数据库中删除记录 . 我们有两个表,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
)

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

4 回答

  • 77

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

    DELETE e FROM emailNotification e 
    LEFT JOIN jobs j ON j.jobId = e.jobId 
    WHERE j.active = 1 AND CURDATE() < j.closeDate
    
  • 6

    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
    

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

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

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

  • 1

    您可以尝试以下内容:

    DELETE FROM emailNotification
    WHERE jobId IN (
     SELECT jobId FROM jobs j
     WHERE j.active = 1
    )
    
  • 3

    如果目标是删除匹配的行,比如删除第一个表中具有第二个关系的行,为了避免删除整个第一个表,你应该为第二个表添加额外的“where”条件

    DELETE f FROM firsttable f 
    LEFT JOIN secondtable s ON f.related_id = .jobId 
    WHERE s.related_id
    

相关问题