アプリケーションがテーブル内の ID を正しく更新する必要があるときに正しく更新しないという問題に対処するために、既存のクライアント データを構成する必要がある状況があります。
これがシナリオです。既存の行を効果的に置き換える行を挿入できる親テーブルがあります。置換は再帰的に行うことができます。親テーブルを指すフィールドを持つ子テーブルもあります。既存のデータでは、子テーブルが置換された行を指している可能性があり、それを修正する必要があります。ただし、各行を置換行に単純に更新することはできません。その行も置換されている可能性があり、最新の行を反映する必要があるためです。
これを実現する CTE を作成する方法を見つけようとしていましたが、実際に探しているものを見つけるクエリを見つけるのに苦労しています。これは、私が使用しているテーブルのサンプルです。'ShouldBe' 列は、いくつかの行の再帰的な置換を考慮して、更新クエリを終了させたいものです。
DECLARE @parent TABLE (SampleID int,
SampleIDReplace int,
GroupID char(1))
INSERT INTO @parent (SampleID, SampleIDReplace, GroupID)
VALUES (1, -1, 'A'), (2, 1, 'A'), (3, -1, 'A'),
(4, -1, 'A'), (5, 4, 'A'), (6, 5, 'A'),
(7, -1, 'B'), (8, 7, 'B'), (9, 8, 'B')
DECLARE @child TABLE (ChildID int, ParentID int)
INSERT INTO @child (ChildID, ParentID)
VALUES (1, 4), (2, 7), (3, 1), (4, 3)
更新スクリプトが適用された後、子テーブルで望ましい結果が得られます。
ChildID ParentID ParentID_ShouldBe
1 4 6 (4 replaced by 5, 5 replaced by 6)
2 7 9 (7 replaced by 8, 8 replaced by 9)
3 1 2 (1 replaced by 2)
4 3 3 (unchanged, never replaced)