2017-01-17 52 views
0

開始するにはSQLスクリプトに堪能ではありませんが、タスクが与えられています。で何をすべきか重複を削除するためのSQL Serverストアドプロシージャ

、表1から各顧客の重複を取得する(table1にidとID3を持っている)

私はこの部分が

SELECT * 
FROM table1 t1 
WHERE EXISTS (SELECT * 
       FROM table1 t2 
       WHERE t1.name = t2.name AND t2.id IS NULL) 
ORDER BY Id, Name 

または

SELECT t1.* 
FROM table1 t1 
INNER JOIN 
    (SELECT [Name] 
     FROM table1 
     GROUP BY t1. [Name] 
     HAVING COUNT(*) > 1) t2 ON t1.Name = t2.Name 
ORDER BY t1.Customer, t1.Name 
でなんとかする必要がありますと仮定

その後、これらの重複のIDをtable2と相互参照し、対応するID(ID2)をtable2から取得する必要があります。

私はこの部分がIDまたは一時テーブル名所定のリストに対応するとNULLがあるべきではないID3を有するTABLE1から

複製を格納する配列のいくつかの種類によって行われるべきであることを前提としてい(各重複のための最初のエントリだけを残す)顧客ごとに他の重複のすべてとともに

DELETE FROM table1 
WHERE Name IN ('name1', 'name2'.......) 
    AND id3 IS NOT NULL 

よう

何かを削除しました。

+0

サンプルデータを追加できますか? – SqlZim

+0

2人の異なる顧客が同じ名前を持つことはできませんか?間違いなくサンプルデータが必要です。 – VDK

+0

はい2の顧客は、テーブル内で同じ名前を持つことができますが、エントリ内に同じ名前を複数回付けてはいけません。 ジョンデイドリーム ジョンデイドリーム ピーター・デイドリーム ピーター・デイドリーム ピーター・デイドリーム アンバーFly_co アンバーFly_co ジャッキーFly_co ジャッキーFly_co –

答えて

0

質問を明らかにすることができるまで、私はバージョンrow_number()common table expressionを使用して起動したい:あなたはすべての重複レコードを削除するには、共通テーブル式を使用することができるはず

;with cte as (
    select * 
     , rn = row_number() over (
      partition by name 
      order by isnull(id,2147483647), isnull(id3,0) 
      ) 
    from table1 t1 
    --/* 
    where exists (
     select 1 
     from table1 t2 
     where t1.name = t2.name 
      and t2.id is null 
     ) 
    --*/ 
) 

--/* 
select * 
    from cte o 
    where exists (
    select 1 
     from cte i 
     where i.name=o.name 
     and i.rn>1 
     ); 
    --*/ 

    --delete from cte where rn>1; 
0

。これは、最初のものを除くすべてのものを削除することができるすべての複製に番号を付けます。このコードを必要に応じて変更できるはずです。何かを削除する前に、CTEから最初に選択してテストします。

WITH CTE AS(
    SELECT *, ROW_NUMBER()OVER(PARTITION BY col1, col2 ORDER BY col3) as row_num 
    FROM table1 
    where col4 = 'SOMETHING' //optional 
) 

--select * from CTE 
--select * from CTE where row_num > 1 

delete from CTE where row_num > 1 
関連する問題