1

SQLクエリは次のとおりです。

MERGE  tblProductsSold

USING tblOrders on tblOrders.OrderID = tblProductsSold.txtOrderID

WHEN NOT MATCHED THEN 

Insert ( txtOrderID, txtOrderdate, txtPartno, txtQty)  
values 
(SELECT tblItemsOnOrder.txtOrderID, 
 tblOrders.txtDateTime, 
 tblItemsOnOrder.txtPartNO, 
 tblItemsOnOrder.txtQTY
FROM tblOrders  INNER JOIN tblItemsOnOrder 
ON tblOrders.OrderID = tblItemsOnOrder.txtOrderID
WHERE tblOrders.txtIsConfirmed = '1'
)

OUTPUT $action ;

望ましい結果:ProductsまだtblProductsSoldテーブルにない注文をインポートする必要があります

4

1 に答える 1

12

今のようにアプローチすることはできません。

このMERGEステートメントは、2つのテーブル(ヘッダーで定義した2つのテーブル)をソーステーブルとターゲットテーブルにマージします。

現在、tblOrdersソースとして、およびtblProductsターゲットとして使用しています。それだけでも奇妙に思えます-注文製品にマージしようとしていますか?あまりふさわしくないようです...

ソーステーブルとターゲットテーブルを定義したら、ソースのどの行がターゲットに存在するか(または存在しないか)を比較します。ソースの特定の行がターゲットに存在しない場合は、その値をターゲットテーブルに挿入できます。

ただし、これはソーステーブルの直接の列値に対してのみ機能します。外に出て他のテーブルにサブクエリを実行することはできません。

だから私はあなたが本当にすべきことはこれだと信じています:

  • ソースとして-注文に含まれる製品を一覧表示するビューがあります-製品(注文自体ではありません)

  • 次に、テーブルをこのビューと比較しますProducts。注文にベーステーブルに存在しない製品が含まれている場合は、Productsそれらを挿入します。

したがって、次のようなものが必要になります。

MERGE  tblProductsSold AS Target
USING (SELECT tblItemsOnOrder.txtOrderID, tblOrders.txtDateTime, 
              tblItemsOnOrder.txtPartNO, tblItemsOnOrder.txtQty
       FROM tblOrders  
       INNER JOIN tblItemsOnOrder ON tblOrders.OrderID = tblItemsOnOrder.txtOrderID
       WHERE tblOrders.txtIsConfirmed = '1') AS Source
   ON Source.OrderID = Target.txtOrderID

WHEN NOT MATCHED THEN 
    INSERT (txtOrderID, txtOrderdate, txtPartno, txtQty)  
    VALUES (Source.OrderID, Source.txtDateTime, Source.txtPartNo, Source.txtQty)

OUTPUT $action ;
于 2013-02-26T12:13:25.950 に答える