2

生データを保持するソース テーブルがあります。

SourceTable 
SD               Product  P1  P2 
'01-Mar-2013'    'Prod1'  1   2
'02-Mar-2013'    'Prod1'  3   4
'03-Mar-2013'    'Prod1'  5   6
'04-Mar-2013'    'Prod1'  7   8
'04-Mar-2013'    'Prod2'  6   5

そして、以下のような宛先テーブルがあります。

DestinationTable 
SD               Product  P1  P2 Active  
'01-Mar-2013'    'Prod1'   9  10    1

各製品の毎日のソース テーブルからのデータを処理し、すべての新しい行を宛先テーブルに挿入するクエリを作成しようとしていますが、dest の Active 列も 0 に更新する必要があります。一致する行がソースで見つかった場合 (これは、SD 列と Product 列が宛先に存在するかどうかで判断されます)。

データを処理した後、DestinationTable は次のようになります。

SD               Product  P1  P2 Active  
'01-Mar-2013'    'Prod1'   9  10    0
'01-Mar-2013'    'Prod1'   1   2    1
'02-Mar-2013'    'Prod1'   3   4    1
'03-Mar-2013'    'Prod1'   5   6    1
'04-Mar-2013'    'Prod1'   7   8    1
'04-Mar-2013'    'Prod2'   6   5    1

MERGE でこれを実行しようとしましたが、一致が見つかったときに更新と挿入を同時に行うことはできません。

MERGE DestinationTable AS d
USING (SELECT SD, Product, P1, P2 FROM SourceTable) AS s ON d.Product = s.Product AND s.SD = d.SD 
WHEN MATCHED THEN UPDATE SET d.P1 = s.P1, 
                         d.P2 = sdsP2
                         d.Active = 0
WHEN NOT MATCHED THEN
    INSERT(SD,Product, P1, P2, Active)
    VALUES(s.SD, s.Product, s.P1, s.P2, 1);

OUTPUTステートメントを使用してSQLでやりたいことを実際に実行しましたが、これはOracle 10g用であり、OracleにはSQLと同じOUTPUTがありません。

これを達成する他の方法はありますか?これは MERGE で行う必要はありません。他のソリューションを受け入れることができます。

ありがとう

4

2 に答える 2

4

あなたがしたいことは

  1. からすべてのレコードを挿入sourceするdestination
  2. destination.activeのレコードに一致する列の列を更新しますsource

あなたが正しく指摘しているように、MERGE は、更新や挿入ではなく、一致するレコードを見つけたときに更新を行いたいため、MERGE でこれを行うことはできません。

したがって、これを2つのステートメントとして実行することに固執していると思います。destination 最初に更新してから、からレコードを挿入しsourceます。

UPDATE と INSERT はどちらも RETURNING 句をサポートしています。これにより、更新または挿入された行の識別子 (およびその他の列) を収集できます。これはドキュメントにあります:詳細をご覧ください

于 2013-05-07T14:26:41.440 に答える
2

なぜ2つのクエリを実行しないのですか?

 UPDATE DestinationTable
 SET Active = 0
 WHERE EXISTS (SELECT 1
               FROM SourceTable
               WHERE DestinationTable.Product = SourceTable.Product AND
                     DestinationTable.SD = SourceTable.SD)
于 2013-05-07T14:27:55.683 に答える