2016-11-11 3 views
1

これはストアードプロシージャ内のクエリの1つです。Mainテーブルのレコードを重複テーブルに挿入しています。メインテーブルの複数の行を複数回複製します。テーブル内の同じ値を持つ重複行を削除しますが、SQL Serverでは1行を保持します

これは私のコード進行させる助けを求める

IF EXISTS (SELECT * 
      FROM [JOB] 
      WHERE 
       AND ExternalSourceId = @ExternalSourceId 
       AND Id <> @Id 
       AND IsActive = 1) 
BEGIN 
    INSERT INTO DupJob 
     SELECT * 
     FROM [JOB] j 
     WHERE 
      AND ExternalSourceId = @ExternalSourceId 
      AND Id <> @Id 
      AND IsActive = 1 
      AND NOT EXISTS (SELECT * FROM DupJob dj WHERE J.Id = dj.Id)  
    -- the delete should delete all duplicates except one ? 
END  

で、感謝

+0

どのような問題が発生していますか? –

+0

私はちょうど削除ステートメントを進める方法をしたい – user1221765

答えて

1

row_number()とCTEは、これを行うための便利な方法です。私はあなたが欲しいロジックがあり、正確にはよく分からないが、それはこのようなものである:これはpartition byの列ごとに1行、idの最小値を持つものを保持します

with todelete as (
     select j.*, 
      row_number() over (partition by OrganizationName, JobTitle, PostalCode, ExternalSourceId) 
           order by id) as seqnum 
     from job j 
    ) 
delete from todelete 
    where seqnum > 1; 

+0

私はrow_number()またはrank()を使用するのと同じと思った。私は上記のクエリと組み合わせて上記を使用できますか? plsは – user1221765

+0

のランクと行番号がネクタイの扱いが微妙に異なることを示唆しています。結びつきがなければ、それは同等です。 –

関連する問題