MySQL:删除行" WHERE ... NOT IN"仅来自一张单

时间:2016-03-16 14:02:00

标签: mysql sql

在MySQL数据库中,我有两个表之间的多对多关系。为简单起见,我们假设这些表格映射homes及其residents。我有第三个表来映射这些关系(home_resident_relations)。后一个表有一个额外的列datemodified,它通过触发器存储每行的最新更新日期。

现在我想摆脱每个家庭的所有前居民,只保留当前的居民 - 那是最新的日期。 我已经有一个工作的SELECT子句,它会列出我想要删除的所有旧关系:

SELECT * FROM `home_resident_relations` WHERE `resident_id` NOT IN 
    (SELECT tbl.`resident_id`   
    FROM `home_resident_relations` tbl
    WHERE tbl.`datemodified` = 
        (SELECT max(tbl2.`datemodified`) 
        FROM `home_resident_relations` tbl2 
        WHERE tbl2.`home` = tbl.`home` 
        GROUP BY tbl2.`home`)
    OR tbl.`datemodified` IS NULL
);

现在,只需用SELECT *命令替换DELETE即可删除所有这些行,这是一个直截了当的想法。但是,由于错误

,这不起作用
#1093 - You can't specify target table 'home_resident_relations' for update in FROM clause

所以这是我的问题:

如何在WHERE ... NOT IN子句中使用它时从表中删除?

2 个答案:

答案 0 :(得分:1)

尝试将DELETE与join:

一起使用
DELETE FROM `home_resident_relations`
LEFT OUTER JOIN 
               (SELECT tbl.`resident_id`   
                FROM `home_resident_relations` tbl
                WHERE tbl.`datemodified` = 
                                          (SELECT max(tbl2.`datemodified`) 
                                           FROM `home_resident_relations` tbl2 
                                            WHERE tbl2.`home` = tbl.`home` )
                OR tbl.`datemodified` IS NULL) s
 ON(s.`resident_id` = `home_resident_relations`.`resident_id`)
WHERE s.`resident_id` is null

答案 1 :(得分:1)

改为使用left join

DELETE hrr
    FROM `home_resident_relations` hrr LEFT JOIN
         (SELECT tbl.`resident_id`   
          FROM `home_resident_relations` tbl
          WHERE tbl.`datemodified` = (SELECT max(tbl2.`datemodified`) 
                                      FROM `home_resident_relations` tbl2 
                                      WHERE tbl2.`home` = tbl.`home` 
                                      GROUP BY tbl2.`home`
                                     ) OR
               tbl.`datemodified` IS NULL
         ) tt
         ON hrd.resident_id = tt.resident_id
    WHERE tt.resident_id IS NULL;

这适用于SELECTDELETE