2016-06-20 11 views
0

私はSOURCEテーブルとTARGETテーブルを持っています。 列aとbの組み合わせを考慮して、SOURCEテーブルから重複レコードを削除したい(または、TARGETテーブルにDISTINCTレコードのみを挿入したいとします)。誰かが助けてくれますか?クラスタ化された主キーを持つ重複レコードの削除

CREATE TABLE #SOURCE (
    a  int NOT NULL, 
    b  int NOT NULL, 
    c  int NOT NULL, 

); 

INSERT INTO #SOURCE (a, b, c) 
VALUES (1, 2, 3), 
     (1, 3, 4), --either this record or the one below should be deleted 
     (1, 3, 6), 
     (3, 4, 5), 
     (3, 5, 6), 
     (5, 6, 7), 
     (5, 7, 8), --either this record or the one below should be deleted 
     (5, 7, 0) 
     (6, 8, 9); 

CREATE TABLE #TARGET (
    a  int NOT NULL, 
    b  int NOT NULL, 
    c  int NOT NULL, 

CONSTRAINT pk PRIMARY KEY CLUSTERED (a, b) 
); 

だから私は、私だけで明確な記録(A + B)を挿入したい、私は上記の言ったように、ソーステーブル(私はコメントで上記マークおそらくもの)から、または他の言葉でレコードを削除する必要がありますTARGETテーブル。

+0

の可能性のある重複[二つの列に3列と重複排除を選択SQL](http://stackoverflow.com/questions/11402025/sql-select-3-columns-and-dedupe 2列) –

答えて

1

あなたはABROW_NUMBER()PARTITIONでこれを行うことができます。

;With Cte As 
(
    Select *, 
      Row_Number() Over (Partition By A, B Order By C) RN 
    From #SOURCE 
) 
Insert #TARGET 
     (A, B, C) 
Select A, B, C 
From Cte 
Where RN = 1 
+0

こんにちは、お返事ありがとうございます。 RowNumber()以上(Partition By A、B Order By C)RN – Newbie

+0

'ROW_NUMBER(ROW_NUMBER())は、SQLで比較的新しく、詳細を知ろうとしているので、 )OVER(PARTITION BY A、B ORDER BY C) 'は、別々の' A'、 'B'値の各グループに番号を割り当て、割り当てられたインクリメント番号は' C'値の順序に基づいています。 'ROW_NUMBER()'の結果は 'INSERT'ステートメントの代わりに' SELECT * FROM Cte'を実行して見ることができます。 – Siyual

+0

@Downvoter - コメントしますか? – Siyual

0

あなたはA、Bによってターゲットだけのグループに入れますCのどの値を気にし、選択していないので、 C.

の最小/最大
Insert into #target select a,b,min(c) 
from #source 
group by A,B 
関連する問題