Iは、以下の構造を持つテーブルを継承:残り(rn <>1
)が挿入(順次)更新する必要がありながらCTEをパスの更新に使用できますか?
rowID rn userID Data1 Data2 Data3
----- -- ------ ----- ---- ----
1 1 1 A null 123
2 2 1 B 111 null
3 1 2 C 222 333
4 2 2 D null null
5 3 2 E 111 null
6 1 3 F 333 222
第RECS(rn=1
)は、挿入される必要があります。 where rn = 1
を使用して簡単に挿入し、userIDがないかどうかを確認できます。
私の問題は、私は、ユーザー表が最新の状態が反映されるようになりましたrn <>1
を使用して順次、すべてのRECSを更新する必要があるということです。それ、更新後のユーザテーブルには、次のようになり、次のとおりです。
rowID userID Data1 Data2 Data3
----- ------ ----- ----- -----
1 1 B 111 123
2 2 E 111 333
3 3 F 333 222
私の考えはそれぞれ「合格」のすべてのRECSをつかむだろうCTEを、書くことがあった場所RN = 2、そして= RN 3、その後、RN = 4 ....私はもう処理する必要がありません。この方法で、私はセットで更新することができます。
が、これは可能です(または私がやる-しばらく使用する必要がありますか)?もしそうなら、再帰的なものか「通常の」CTEが必要ですか?
;with my_cte (rowID, rn, userID, Data1, Data2, Data3, val) As
(
SELECT rowID, rn, userID, Data1, Data2, Data3, val
from @MyTempTable x
where rn =1
UNION ALL
SELECT rowID, rn, userID, Data1, Data2, Data3, b.val +1
from @MyTempTable y
INNER JOIN
my_cte b
ON y.userID = b.userID
WHERE y.rn = b.val +1
)
UPDATE userTable
SET
[Data1] = COALESCE(c.Data1, [Data1])
,[Data2]= COALESCE(c.Data2, [Data2])
,[Data3]= COALESCE(c.Data3, [Data3])
From @MyTempTable c
JOIN
( SELECT user_id
FROM my_cte
WHERE rn<>1
) b
ON b.user_id = c.user_id
WHERE
EXISTS
( Select userID
from userTable q
Where q.userId = b.userId
)
が、私はこれを動作させることができなかった、それは最初の行だけが更新されるようになっています。ここでは
は、私が試したものです。何かご意見は?私はCTEのつもりです。何よりも、CTEが何をしているのかを知りたがっています...アップデートが「パス」で実行される可能性はありますか?
'Data1'がために' userID' 1は**すべきではない** Bとあなたの現在の最大値は何ですか'rn'? –
@リーブン、そうです。私は元の投稿を編集しました。私は何ができるか分からない。それは現在最大19で、私は確かに高くなる可能性があります。 – user991945