2017-04-27 18 views
0

私は重複を削除する問題を抱えています。ここで重複を作成するのは、例をあげて下に示します。
idが異なる列にある重複を削除するにはどうすればよいですか?

EmployeeID IDnr1 IDnr2 
123456  111111 222222 
123456  222222 111111 

私はこれらの行のいずれかを削除したいです。誰に関係なく。 私は、このような重複した行が数千件あります。
ありがとうございます。

+0

最終的に重複はありません。異なる列にあり、異なる値を持っています。 –

答えて

1

GROUP BY句にCASEという表現を使用してください。それを行うには

クエリ

select [EmployeeID], min([IDnr1]) [IDnr1], max([IDnr2]) [IDnr2] 
from [your_table_name] 
group by [EmployeeID], 
case when [IDnr1] > [IDnr2] then [IDnr1] else [IDnr2] end, 
case when [IDnr1] > [IDnr2] then [IDnr2] else [IDnr1] end; 

Find a demo here

+0

パーフェクト。これはうまくいった。ありがとう:D – torbol

1

一つの方法は、row_number()でCTEを使用しています。

;WITH CTE AS 
(
    SELECT EmployeeID, 
      ROW_NUMBER() OVER(PARTITION BY EmployeeID, 
      CASE WHEN IDnr1 < IDnr2 THEN IDnr1 ELSE IDnr2 END, 
      CASE WHEN IDnr1 < IDnr2 THEN IDnr2 ELSE IDnr1 END 
      ORDER BY (SELECT NULL)) rn 
    FROM @T 
) 

:最小値を取得するために例の使用を注意してください -

(私たちを保存します将来の質問では、このステップください)CTEは

DECLARE @T AS TABLE 
(
    EmployeeID int, 
    IDnr1 int, 
    IDnr2 int 
) 

INSERT INTO @T VALUES 
(123456, 111111, 222222), 
(123456, 222222, 111111), 
(123456, 111112, 222222), 
(123457, 222222, 111111) 

をサンプルテーブルを作成し、移入削除ステートメント:

DELETE 
FROM CTE 
WHERE rn > 1 

See a live demo on rextester.

ただし、重複を削除することは、作業の一部に過ぎません。新しい複製をテーブルに挿入できないようにしたいとします。これを行うには、テーブルにチェック制約を追加する必要がありますが、まずテーブルを更新します。 このステップは必ずチェック制約を追加することができようになります。

UPDATE TableName 
SET Idnr1 = Idnr2, 
    Idnr2 = Idnr1 
WHERE Idnr1 >= Idnr2 

すると、チェック制約を追加します。これは、新しい重複があなたのテーブルに挿入することはできないことを確認します

ALTER TABLE TableName 
ADD CONSTRAINT CK_TableNamePreventDups CHECK(Idnr1 < Idnr2) 
GO 

を。

関連する問題