19

[名前]列に重複が多いテーブルがあります。それぞれに1行だけ保持したいと思います。

以下に重複をリストしますが、重複を削除して1つだけ保持する方法がわかりません。

SELECT name FROM members GROUP BY name HAVING COUNT(*) > 1;

ありがとうございました。

4

9 に答える 9

49

次の質問を参照してください:テーブルからの重複行の削除

そこから適応された受け入れられた回答(これが私の答えなので、ここでは「盗難」はありません...):

一意の ID フィールドがあると仮定すると、簡単な方法でそれを行うことができます。ID を除いて同じであるが、名前に「最小 ID」がないすべてのレコードを削除できます。

クエリの例:

DELETE FROM members
WHERE ID NOT IN
(
    SELECT MIN(ID)
    FROM members
    GROUP BY name
)

一意のインデックスがない場合は、単純に自動増分の一意のインデックスを追加することをお勧めします。主な理由は、それが優れた設計であるためですが、上記のクエリを実行できるためでもあります。

于 2009-08-17T09:01:09.357 に答える
4

一意のものを新しいテーブルに選択し、古いテーブルを削除してから、一時テーブルの名前を変更して置き換える方がおそらく簡単でしょう。

#create a table with same schema as members
CREATE TABLE tmp (...);

#insert the unique records
INSERT INTO tmp SELECT * FROM members GROUP BY name;

#swap it in
RENAME TABLE members TO members_old, tmp TO members;

#drop the old one
DROP TABLE members_old;
于 2009-08-17T08:53:01.183 に答える
0

削除しようとしている行を最初に確認したい場合。次に、それらを削除します。

with MYCTE as (
    SELECT DuplicateKey1
        ,DuplicateKey2 --optional
        ,count(*) X
    FROM MyTable
    group by DuplicateKey1, DuplicateKey2
    having count(*) > 1
) 
SELECT E.*
FROM MyTable E
JOIN MYCTE cte
ON E.DuplicateKey1=cte.DuplicateKey1
    AND E.DuplicateKey2=cte.DuplicateKey2
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt

http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/の完全な例

于 2016-09-05T18:56:55.740 に答える
0

重複を削除することが定期的なメンテナンスプロセスの一部である巨大なデータベースがあります。DISTINCT を使用して一意のレコードを選択し、それらを TEMPORARY TABLE に書き込みます。TRUNCATE の後、TEMPORARY データを TABLE に書き戻します。

それはそれを行う 1 つの方法であり、STORED PROCEDURE として機能します。

于 2009-08-17T09:06:30.187 に答える
-1
WITH CTE AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY [emp_id] ORDER BY [emp_id]) AS Row, * FROM employee_salary
)


DELETE FROM CTE
WHERE ROW <> 1
于 2018-10-02T10:56:09.240 に答える