4

好的,所以如果您想了解背景故事,请查看我的上一个问题

找出我的哪些记录不是重复的很容易:

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

我的猜测是,虽然查询返回唯一的、已在表中的记录,但通过聚合函数删除是不合理的。这是可以理解的,除了我不知道我还能做些什么来确保只删除我移动的记录。我搜索并没有发现“在插入原始表中的记录之后”语法,我的猜测是它无论如何都会失败,原因与删除失败的原因相同。

那么,有人可以帮我找到丢失的部分吗?

4

5 回答 5

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
)
于 2009-09-08T07:58:13.163 回答
4

我不会用聚合函数删除。我想你想删除所有插入的数据?

为什么不尝试这样的事情:

DELETE 
FROM eventlog
WHERE (user, event_date) IN (SELECT user, event_data FROM no_duplicates)
于 2009-09-08T08:01:09.953 回答
4

什么是数据库?如果是 MySQL 那么

目前,您不能在子查询中从表中删除并从同一个表中选择。

至少对于 5.0 版本。( http://dev.mysql.com/doc/refman/5.0/en/delete.html )

于 2009-09-08T09:29:59.920 回答
1

你应该看看DELETE 语法,既没有 GROUP BY,也没有 HAVING,也没有 ORDER。

于 2009-09-08T07:59:14.423 回答
-1

您可以尝试添加主键自动增量列,将您的唯一性移动到新表中并删除 eventlog.* from eventlog e inner join no_dupes nd on e.id=nd.id

于 2009-09-08T07:58:12.673 回答