2009-08-03 4 views
41

MS Accessには、重複した行を検索するためのSQLコードを生成するボタンがあります。 SQL Server 2005/2008 Managment Studioにこれがあるかどうかはわかりません。重複を見つけるT-SQLコードを取得するにはどうすればよいですか?

  1. それが持っている場合は、ポイントしてくださいどこ

  2. それはしていない場合、私はこのようなコードを作成するためのT-SQLヘルパーを持つことができる方法を教えてください。

答えて

107

まあ、テーブルに重複している行がある場合は、少なくともそのテーブルにプライマリキーが設定されていません。そうでない場合は少なくともプライマリキーの値が異なります。

しかし、ここでは列のセット上で重複を取得するためにSQLを構築する方法は次のとおりです。

SELECT col1, col2, col3, col4 
FROM table 
GROUP BY col1, col2, col3, col4 
HAVING COUNT(*) > 1 

これは、列COL1、COL4のために、同じ値の組み合わせを有し、行を見つけるだろう、複数回。

例えば、以下の表に、行2 + 3が重複することになる。

PK col1 col2 col3 col4 col5 
1  1  2  3  4  6 
2  1  3  4  7  7 
3  1  3  4  7  10 
4  2  3  1  4  5 

2つの行が列COL1、COL4に共通の値を共有し、したがって、そのSQLによって、重複と考えられるが。これを分析したいすべての列を含む列のリストを展開します。

+0

あなたのコードは、私が予想ほど難しいことではありませんので、ポイントを持っています。他のSQL言語では、手作業でコード化するのが難しいかもしれません。 –

+3

これは標準のSQLであり、T-SQL特有のものではありません。それは、MySQL、SQLite、Oracle、Sybase、DB2などで同じでなければなりません –

+0

あなたはそうです。構文の強調表示やノイズの多いコードの欠如は、私がMS Accessが生成したコードが理解しにくいと私は前に試していないと信じさせました。 –

2

AFAIK、それはありません。 select文をテーブルのすべてのフィールドでグループ化し、数が1より大きい場合にhaving句を使用してフィルタリングします。

キー以外の行が重複している場合は、選択フィールド。

51

は、SQL Server 2005+を使用している場合は、あなたが他の列と一緒にすべての行を参照するには、以下のコードを使用することができます。

SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
FROM table 

ヤウドも削除(あるいはそうでないと動作)することができますが、これを使用した複製します技術:

WITH cte AS 
(SELECT *, ROW_NUMBER() OVER (PARTITION BY col1, col2, col3, col4 ORDER BY (SELECT 0)) AS DuplicateRowNumber 
    FROM table 
) 
DELETE FROM cte WHERE DuplicateRowNumber > 1 

ROW_NUMBERは非常に強力である - 私は、このゾルを見つけたhttp://msdn.microsoft.com/en-us/library/ms186734.aspx

+3

+1私たちに教育方法を教えてください。また、スニペットにはPKも含まれています。 /necro – theTuxRacer

+0

これはトップ1に投票する必要があります – SQueek

+0

もう一つの利点は、私が見たアプローチではグループよりも速く走っているようです。 –

5

でそれにBOLの記事を参照してください - あなたはそれを行うことができます非常にありution私は1つのまたは複数の重複したフィールドを持つ行全体をダンプする必要がありますが、私は、テーブル内のすべてのフィールド名を入力したくないとき:

SELECT * FROM db WHERE col IN 
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1) 
    ORDER BY col 
関連する問題