从符合一个条件的表中删除,其中同一个表中的行匹配不同的条件?

时间:2012-10-10 19:10:23

标签: mysql

很抱歉这个巨型标题......我试图描述得足够多。我有一个包含事件出勤数据的表,其中包含一些错误数据。表定义有点像这样:

id (row id)
date
company_name
attendees

最终出现了一些情况,其中对于给定日期,有两个条目匹配company_name和date,但其中一个参与者= 0,另一个参与者> 0。在这些情况下,我想丢弃参与者= 0的那些。

我知道您在删除时无法加入同一个表,因此请将此查询视为伪代码,以显示我想要完成的内容。

DELETE FROM attendance a WHERE a.attendees=0 AND a.date IN (SELECT b.date FROM attendance b WHERE b.attendees > 0 AND b.company_name = a.company_name);

我还尝试使用要删除的行的id填充临时表,但该查询因IN(SELECT ...)子句而挂起。我的表有几千行,所以只需最大化CPU然后超时。

1 个答案:

答案 0 :(得分:2)

这个丑陋的东西应该有用(使用别名允许以避免You can't specify target table for update in FROM clause错误)

DELETE FROM attendance
WHERE (attendees, date, company_name)
IN (SELECT c.a, c.d, c.c 
    FROM
     (SELECT MIN(attendees) a, date d, company_name c
      FROM attendance
      GROUP BY date, company_name
      HAVING COUNT(*) > 1) as c);

SqlFiddle