-3

私の整然とした狂気は機能していません...私は何かが欠けています. 初めて、同じテーブル内の重複をクリーンアップする任務を負っています。私はグーグルで検索して、一般的なテーブル式で削除するなどの多くのことを見つけましたが、実際に使用できるものは何もありません。

私のアドレステーブルは次のとおりです。

Address
--------
id
add1
add2
city 
state
zip
parentidofthisdup    

重複と行番号を取得したい。行番号1のIDを親と見なします。プルバックした dup アドレスの後続の行には、arentidofthisdup で親の ID をスタンプしたいと思います。親を保持し、parentidofthisdup に親 ID を持つものを処分することになります。

Common Table Expression を実行してから相関更新で cte を使用して、この更新を行おうとしていますが、うまくいきません。私が得たのは、すべてのレコードが更新されたが、null 値のみがparentidofthisdup になるということだけです。

多分私はこれを正しい方法でコーディングしていません。私は大量更新ではかなり新しいです。

-- My common table expression of the set that I want stamped
with tbFlagTheseWithPk as
(
Select * from 

(
 select  
    myaddress.id,
    myaddress.parentidofthisdup,              
    myaddress.add1, 
    myaddress.add2,
    myaddress.state,
    myaddress.zip,
    row_number() over (partition by add1, state, zip order by add1, state, zip, add2) as [rn]   
    from myaddress
  where     add1 !=''
) as a
where a.rn > 1)

-- Now use our Common Table Expression using a correlated subquery to make them children of rn 1

Update tbFlagTheseWithPk
set 
set parentidofthisdup = 
(   Select id from                                                                                                  
     (Select * from  
    (   select      myaddress.pkey,                                                                          myaddress.parentidofthisdup,                                                                   myaddress.add1,                                                                                 myaddress.add2,
myaddress.state,
myaddress.zip,
row_number() over (partition by add1, state, zip order by a1, state, zip, add2) as [rn]
from myaddress where add1 !=''   
    ) as a                                                                                                  
    where a.rn > 1) as  b  

    where   b.a1 = tbFlagTheseWithPk.add1                                                                                
    and 
 b.state = tbFlagTheseWithPk.state
 and
 b.zip = tbFlagTheseWithPk.zip

    and 
 tbFlagTheseWithPk.rn = 1

これを行うより良い方法はありませんか?この大量更新の学習曲線を乗り越えるにはどうすればよいですか? エレガントな方法でこれを行うことができるはずだと感じていますが、すぐにこれを理解できない場合は、カーソルをループして SQL の美しさに目をつぶる必要があります...しかしそれは悲劇だろう。

4

1 に答える 1

1

カーソルは絶対に使用しないでください。

あなたは正しい軌道に乗っています。これらのリンクはSQL Server に役立つ可能性があり ます - 更新時の内部結合 、 Row_Number http://msdn.microsoft.com/en-us/library/ms186734.aspx、CTE http://msdn.microsoft.com/en-us/library/ ms190766(v=sql.105).aspx

DECLARE  @myAddress table
(id int, parentidofthisdup int, add1 nvarchar(10),add2 nvarchar(10) , [state] nvarchar(10),zip nvarchar(10) ) ;


Insert into @myAddress Values(1,null,'a','b','c','d');
Insert into @myAddress Values(2,null,'a','b','c','d');
Insert into @myAddress Values(3,null,'a','b','c','d');
Insert into @myAddress Values(5,null,'a','b','c','d');
Insert into @myAddress Values(6,null,'a','f','c','d');
Insert into @myAddress Values(7,null,'a','b','g','d');
Insert into @myAddress Values(8,null,'a','f','c','d');
with cte AS 
(
select  
    myaddress.id,
    myaddress.parentidofthisdup,              
    myaddress.add1, 
    myaddress.add2,
    myaddress.state,
    myaddress.zip,
    row_number() over (partition by add1, add2, state, zip order by id,add1, [state], zip, add2) as [rn]   
    from @myaddress myaddress


)


update r SET parentidOfthisDup
    = cte.id
    From cte Inner join @myAddress r
    ON cte.add1 = r.add1
          AND cte.add2 =r.add2
          AND cte.Zip =r.zip
          AND  cte.[state] =r.[state]
          and cte.id<>r.id
    WHERE cte.rn = 1 


select * from @myAddress
于 2013-02-15T12:45:18.530 に答える