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

私の推測では、クエリはテーブル内に既に存在する一意のレコードを返しますが、集計関数による削除は適切ではありません。移動したレコードのみが削除されるようにするために他に何ができるかわからないことを除けば、これは理解できます。検索したところ、「元のテーブルのレコードを INSERT で削除した後」という構文は見つかりませんでした。削除が失敗したのと同じ理由で、とにかく失敗すると思います。

それで、誰かが欠けているピースを見つけるのを手伝ってくれませんか?

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

データベースとは何ですか?MySQLの場合

現在、サブクエリでテーブルから削除して同じテーブルから選択することはできません。

少なくとも5.0バージョンの場合。(http://dev.mysql.com/doc/refman/5.0/en/delete.html

于 2009-09-08T09:29:59.920 に答える
4

集計関数では削除しません。挿入されたデータをすべて削除しますか?

次のようなことを試してみませんか。

DELETE 
FROM eventlog
WHERE (user, event_date) IN (SELECT user, event_data FROM no_duplicates)
于 2009-09-08T08:01:09.953 に答える
1

DELETE 構文を確認する必要があります。GROUP BY も HAVING も ORDER もありません。

于 2009-09-08T07:59:14.423 に答える
-1

主キーの自動インクリメント列を追加して、一意のものを新しいテーブルに移動し、eventlog.* を削除してみてください。

于 2009-09-08T07:58:12.673 に答える