2012-01-21 12 views
0

私は検索してきましたが、関連テーブルを作成するためにmergeを使用した例はまだありません。SQL Mergeの使用方法詳細のテーブル関連

ノースウィンDB Order & OrderDetailテーブルを使用することができます。 (このシナリオでは、テーブルの深さは3レベルです。)

簡単にするために、次の表があります。

OrderID - PK - FK to OrderDetails.OrderID 
OrderLineItemNumber - PK - FK to OrderDetails.OrderLineItemNumber 
OrderSequenceNumber - PK 

また

注文

OrderID PK 
OrderNumber 

たOrderDetails

OrderID - PK 
OrderLineItemNumber PK - FK to Orders.OrderID field 

OrderDetailDetails、目にシナリオでは、レコードは上記のテーブルと同じステージングテーブルに書き込まれます。マージでは、3つのステージングテーブルのレコードを3つの一致するプロダクションテーブルにマージする必要があります。

生産OrderテーブルのOrderIdは、ステージOrderテーブルOrderIdの値を共有しません。

マージ条件が満たされている場合OrderIdを作成するOrderDetail & OrderDetailDetails行のために必要とされているので、だから、その後、OrderId(アイデンティティのセット)を生成するためにOrderテーブルへの挿入がなければなりません。

今私はC#でこれを行うサービスを書いていますが、それはそのようなものではありません。

MERGEが見つかりましたので、このような状況で使用できるかどうかを調べています。任意のヒントやポインターを高く評価されます。

ありがとうございました。

編集:出力ストア値を@MergeOutputという一時テーブルに使用しています。

Declare @MergeOutput Table 
(
     ActionType varchar(10), 
     InsertedOrderId int, 
     StagingOrderID int, 
     DeletedOrderId int 
); 

However, I need to do a Merge on all 3 tables. (Order, OrderDetail & OrderDetailDetails) 

Also, these tables have more fields than just the Id's. 

So I've started creating the 2nd Merge for the OrderDetail table. 

MERGE OrderDetail AS OD 
USING(
    SELECT OrderID, 
      OrderLineItemNumber, 
     ProductId 
    FROM OrderDetail AS OD 
    where OrderId IN (Select StagingOrderID from @MergeOutput where ActionType = 'INSERT' 
) AS src(OrderID, 
     OrderLineItemNumber, 
     ProductId 
) 
ON (OD.OrderId = src.Order AND OD.OrderLineItemNumber = src.OrderLineItemNumber) 
WHEN NOT MATCHED By Target THEN 

INSERT INTO <-- (This doesn't work no matter what I've tried so far.) 
    Select (Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId 
; 

上記のコードでは、次のエラーが表示されます。私はすべての3つのテーブル

でレコードを移動するには、マージの機能が必要な

『に』キーワードの近くに 」不正な構文は、私が働いてこれを最後に持っているように。私は、Insert文を変更しなければならなかったルックス次のように。

Insert(OrderId, OrderLineItemId, ProductID) 
Values((Select Distinct InsertedOrderID from @MergeOutput where StagingOrderId = OrderID), src.OrderLineItemNumber, src.ProductId) 

私はちょうど)(私が選択括弧をラップしなければならなかった考え出した。みんなの助けを

おかげで。私は私が運ぶことができます願っています。それ以前にこのInsert文をしようとしましたこれは私の上に3番目のテーブルのrge。

+0

**何**データベースとバージョン?? ** SQL **は多くのデータベースシステムで使用されている言語である構造化問合せ言語です - SQLはデータベース製品ではありません**このようなものはベンダー固有のものです。あなたが使っているデータベースシステム.... –

+0

あなたは 'OUTPUT ... INTO'という概念を誤解しているようです。この質問を見てください:[merge..outputを使ってsource.idとtarget.idの間のマッピングを取得する](http://stackoverflow.com/questions/5365629/using-merge-output-to-get-mapping -ource-id-and-target-id)は、私が見る限り、基本的にあなたがしようとしていることです。また場合によっては、['MERGE'マニュアル](http://msdn.microsoft.com/en-us/library/bb510625.aspx" MERGE(Transact-SQL) ")を手元に置く必要があるかもしれません。 –

+0

挿入物の問題を見たことがあります。それは構文上の問題でした。それが第3のテーブルのために働いた場合は、私たちに知らせてください。そうでなければ、私はあなたを助けるでしょう。 – usr

答えて

0

これは引き続き発生する厄介な問題です。挿入されたID値を抽出する必要があります。SQL Serverでは、INSERTの「仮想テーブル」にOUTPUT句(http://msdn.microsoft.com/en-us/library/ms177564.aspx)を使用してこれを実行できます。これにより、のすべてのが1つのステートメントに挿入されます。

あなたはその後、一時テーブルにIDを押すと、このような適切なマスターIDと詳細レコードを挿入するためにそれらを使用することができます。

INSERT INTO Detail 
SELECT * from Staging_Detail 
JOIN #MasterIDs on Staging_Detail.MasterID = #MasterIDs.MasterID 
+0

MS SQL 2008 R2。私が投稿してから、Staging_OrderテーブルがOrderにマージされたときにOutputを使用してテンポラリテーブルにデータを取り込む方法を理解しました。テーブルにはさらに多くのフィールドがあることに注意してください。私はこれを単純なものにしています。これで、OrderレコードとStagingレコードOrderIdを作成しました。新しいOrderIdにマップできます。そこで、OrderDetailレコードの別のMergeテーブルを開始します。私は現在、Merge Usingと新しいOrderIDのフィールドが必要です。 (私はお詫びしますが、このサイトでは新しい段落の入力を打つことはできません)。マージは許可されていないようです。 – kfrosty

+0

@FrostKris:usrによってリンクされたドキュメントページからわかるように、 'MERGE'は' INTO'を許可します( 'OUTPUT ... INTO'を意味する場合)。また、 'OUTPUT'節を許可するすべてのコマンドのうち、' MERGE'だけが 'INSERTED'や' DELETED'の列だけでなくソーステーブルの列も参照することができます。それを試しましたか? –

+0

@FrostKris:私の前のコメントの2番目のステートメントはあまり正確ではありません。残念ながら、UPDATEとDELETEはソースも参照できます。それでもなお、主なポイントは、あなたの問題に関連する 'MERGE'でそれを行うことができるということです。 –

関連する問題