MS Accessには、重複行を見つけるためのSQLコードを生成するボタンがあります。 SQL Server 2005/2008 Managment Studioにこれがあるかどうかはわかりません。
持っている場合は、どこを指してください
そうでない場合は、このようなコードを作成するためのT-SQLヘルパーがありますか教えてください。
テーブル全体に行全体が重複している場合、少なくともそのテーブルには主キーが設定されていません。そうでないと、少なくとも主キーの値が異なります。
ただし、一連の列で重複を取得する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
1つ以上の重複フィールドを持つ行全体をダンプする必要があるが、テーブル内のすべてのフィールド名を入力したくない場合に、このソリューションを見つけました。
SELECT * FROM db WHERE col IN
(SELECT col FROM db GROUP BY col HAVING COUNT(*) > 1)
ORDER BY col
知る限りではありません。テーブルのすべてのフィールドでグループ化するselectステートメントを作成し、カウントが1より大きいhaving句を使用してフィルタリングするだけです。
キーを除いて行が重複している場合は、選択フィールドにキーを含めないでください。
これを行うもう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は主キーを強制するため、これは行自体との一致を除外する処理も行います。異なるように。