web-dev-qa-db-ja.com

T-SQLコードを取得して重複を見つける方法

MS Accessには、重複行を見つけるためのSQLコードを生成するボタンがあります。 SQL Server 2005/2008 Managment Studioにこれがあるかどうかはわかりません。

  1. 持っている場合は、どこを指してください

  2. そうでない場合は、このようなコードを作成するためのT-SQLヘルパーがありますか教えてください。

52
Jader Dias

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

ただし、一連の列で重複を取得する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では重複と見なされます。列のリストを展開して、分析対象のすべての列を含めます。

SQL Server 2005+を使用している場合、次のコードを使用して、すべての行と他の列を表示できます。

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

Youdは、この手法を使用して重複を削除(または別の方法で処理)することもできます。

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は非常に強力です-それでできることはたくさんあります-BOLの記事を参照してください http://msdn.Microsoft.com/en-us/library/ms186734.aspx

61
Mike DeFehr

1つ以上の重複フィールドを持つ行全体をダンプする必要があるが、テーブル内のすべてのフィールド名を入力したくない場合に、このソリューションを見つけました。

SELECT * FROM db WHERE col IN
    (SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
    ORDER BY col
5
Ferruccio

知る限りではありません。テーブルのすべてのフィールドでグループ化するselectステートメントを作成し、カウントが1より大きいhaving句を使用してフィルタリングするだけです。

キーを除いて行が重複している場合は、選択フィールドにキーを含めないでください。

2
eKek0

これを行うもう1つの方法は、テーブル自体を結合することです。

SELECT *
FROM dbo.TableA aBase
JOIN dbo.TableA aDupes ON aDupes.ColA = aBase.ColA AND
                          aDupes.ColB = aBase.ColB
WHERE aBase.Pkey < aDupes.Pkey

注: aBase.Pkey <aDupes.Pkeyが存在するのは、それ自体に対してテーブルを結合すると条件ごとに2回真になるため、一致ごとに2行が作成されるためです。

つまり:テーブルaBaseにaDupesからの行に等しい行がある場合(ColAおよびColBに基づく)、その一致の反映もtrueになります-aDupesには行に等しい行がありますColAおよびColBに基づくaBase。したがって、これらの一致の両方が結果セットで返されます。

テーブルの1つに下位キーがあるすべての結果を任意に選択することにより、この絞り込み/絞り込みを絞り込みます。

<または>は、キーが異なる限り重要ではありません。

aBase.Pkey <aDupes.Pkeyは主キーを強制するため、これは行自体との一致を除外する処理も行います。異なるように。

0
boylec1986