0
Source Table 

TableSource

SOurceID  Name   ParentId


Target Table

TableTarget

RefId ParentRefId SourceId  Name  

-- RefId は、TableReference からの外部キーです。

Table Reference 

TableReference

RefID -- Auto increment IdentityCOlumn

シナリオ

そのような方法で TableSource と TableTArget をマージ (挿入/更新) する必要があります

1. On Each insert into TableTarget, it should insert a new RefId into TableReference and then Copy that RefId into TableTarget's RefId Column. 

2.ParentRefId also needs to be populated on the basis of ParentID in TableSource I-E

TableSource -- TableSource の最初に次のレコードがあるとします。

SOurceID  Name         ParentId
1A         Group1       NULL
2B         GROUP2       NULL
3C         Department1   1A
4D         Department2   2B
5E         Section1      3C
6F         Section2      4D


-- I want to see TableTarget as following

RefId     SourceId     Name                ParentRefId 

1         1A           Group1              NULL as Group1 doesn't has a parent
2         2B           GROUP2              NULL as Group1 doesn't has a parent
3         3C           Department1         1 -- SourceID 3C's Parent is 1A and RefID of   1A is 1
4         4D           Department2         2 -- SourceID 4D's Parent in TableSOurce is   2B so we need to find the RefId of 2B in TableTarget to insert it here. That's 2
5         5E           Section1            3 -- PArent of 5E is 3C and RefId of 3C is 3
6         6F           Section2            4 -- PArent of 6F is 4D and RefID of 4D is 4

解決:

Name と SourceID のマージは問題ではありません。問題は、TableTarget に挿入するたびに TableReference に新しい RefID を挿入し、それをコピーして tableTarget に挿入する必要があるときに始まります。2 番目の問題は、ParentRefID を入力する方法です。これに関する任意の入力は非常に高く評価されます

* これを行う最善の方法は何でしょうか ** カーソルが必要ですか? 最初に RefID でロードし、ロードする前に ParentRefId を処理する必要がありますか?*

4

1 に答える 1

0

最初のパスで ParentRefID を null のままにする 2 パス ソリューションをお勧めします。RBAR メソッドを使用する場合を除き、tableTarget テーブルに挿入されたばかりのデータを 1 回のパスで使用して、親の参照 ID を「検索」する方法はありません。

そう:

参照に挿入:

insert into tblReference select * from tblSource /* or whatever columns you want */

新しい RefID でターゲットに挿入し、parentRefID を null のままにします。

insert into tblTarget select tblReference.refID, tblSource.SourceID, tblSource.Name, NULL as parentRefID from tblSource inner join tblReference on <-- whatever columns link reference and source tables -->

parentRefIDs を使用したバッチ更新ターゲット:

tblTarget を更新する tblSource からの parentRefID = target_parent.refID の設定 内部結合 tblTarget target_parent on target_parent.sourceID = tblSource.parentID 内部結合 tblTarget on tblTarget.sourceid = tblSource.sourceID

いいえ、MERGE バッチ内で新しく挿入されたデータを使用して後続の挿入/更新に渡すことはできないため、単に MERGE を使用することはできません。

于 2013-01-17T23:45:35.013 に答える