好的,如果您想要一个背景故事,请查看我的previous question
确定哪些记录不重复很容易:
SELECT *
FROM eventlog
GROUP BY event_date, user
HAVING COUNT(*) = 1
ORDER BY event_date, user
这会返回我的所有非重复项。所以我想我会把它们移到另一个名为“no_duplicates”的表中,然后从原始表中删除它们。然后我可以在原始表中单独看到重复项,修复它们,然后添加no_dupes。但同时:
INSERT INTO no_duplicates
SELECT *
FROM eventlog
GROUP BY event_date, user
HAVING COUNT(*) = 1
ORDER BY event_date, user
像魅力一样工作,以下引发错误:
DELETE
FROM eventlog
GROUP BY event_date, user
HAVING COUNT(*) = 1
ORDER BY event_date, user
我的猜测是,当查询返回唯一的,已经在表中的记录时,通过聚合函数删除不是犹太教。这是可以理解的,除了我不知道我还能做些什么来确保只删除我移动的记录。我搜索并发现没有“在INSERT中删除原始表中的记录后”语法,我的猜测是它无论如何都会失败,原因与删除失败的原因相同。
那么,有人可以帮助我找到丢失的部分吗?
答案 0 :(得分:6)
首先,您不需要INSERT和DELETE上的ORDER BY。如果你需要它们用于演示,那将非常有用。
如果您的EVENTLOG表有主键(如ID),您可以像这样形成DELETE语句:
DELETE
FROM eventlog
WHERE id IN (
SELECT *
FROM eventlog
GROUP BY event_date, user
HAVING COUNT(*) = 1
)
答案 1 :(得分:4)
我不会删除聚合函数。我想你想删除所有插入的数据吗?
为什么不尝试这样的事情:
DELETE
FROM eventlog
WHERE (user, event_date) IN (SELECT user, event_data FROM no_duplicates)
答案 2 :(得分:4)
数据库是什么?如果MySQL那么
目前,您无法从表中删除并从子查询中的同一个表中进行选择。
至少为5.0版本。 (http://dev.mysql.com/doc/refman/5.0/en/delete.html)
答案 3 :(得分:1)
你应该看看DELETE syntax,既没有GROUP BY,也没有HAVING,也没有ORDER。
答案 4 :(得分:-1)
您可以尝试添加主键自动增量列,将您的唯一身份移动到新表中并执行删除事件日志。*来自事件日志e内部联接no_dupes nd on e.id = nd.id