很抱歉这个巨型标题......我试图描述得足够多。我有一个包含事件出勤数据的表,其中包含一些错误数据。表定义有点像这样:
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然后超时。
答案 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);