私の整然とした狂気は機能していません...私は何かが欠けています. 初めて、同じテーブル内の重複をクリーンアップする任務を負っています。私はグーグルで検索して、一般的なテーブル式で削除するなどの多くのことを見つけましたが、実際に使用できるものは何もありません。
私のアドレステーブルは次のとおりです。
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 の美しさに目をつぶる必要があります...しかしそれは悲劇だろう。