2

很抱歉这个大标题......我试图描述得足够好。我有一个包含活动出席数据的表,其中包含一些错误数据。表定义是这样的:

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 然后超时。

4

1 回答 1

2

这个丑陋的东西应该可以工作(使用 alias permit 来避免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

于 2012-10-10T19:24:36.797 回答