2

以下のクエリを使用していますが、

MERGE INTO table2 b
     USING (
         SELECT column1,column2,column3
         FROM table1
     ) a
     ON (a.column3 = 'UPDATE')
     WHEN NOT MATCHED THEN
         INSERT (b.column1, b.column2) VALUES (a.column1,a.column2)
     WHEN MATCHED THEN
         UPDATE SET a.column1 = b.column1,a.column2=b.column2;

table2 が空の場合、初めて正常に実行されています。table1 のデータが変更されていないのに 2 回目の実行を行っている場合、エラーが発生しunable to get a stable set of rows in the source tablesます。このエラーの回避策はありますか。

このスレッドで述べたように、私は入れてみましたDistinctが、解決しませんでした..

rowidここで目的を解決する必要があると思いますが、よくわかりません

ありがとう

4

1 に答える 1

5

ON (a.column3 = 'UPDATE')では十分ではありません。

2 つのテーブルが互いにどのように関連しているかを述べる必要があります。これは次の点で重要です。
- Table1 の特定の行が Table2 の 1 つの行と一致する(UPDATE)
- または、Table1 の特定の行が Table2 で一致しない(INSERT)

これは、ON句が 2 つのテーブルを 1:1 または 1:0 で一致させる必要があることを意味します。多くはありません。column1以下のコードでは、それが一意の識別子であると想定しています。その場合は、1:1 の要件に準拠しています。

各テーブルの各行を一意に識別する方法がない場合は、できるようにデータを変更する必要があります。

MERGE INTO
  table2 b
USING (
  SELECT column1,column2,column3
  FROM table1
) a
ON (
  b.column1 = a.column1
)
WHEN NOT MATCHED THEN
  INSERT (b.column1, b.column2) VALUES (a.column1,a.column2)
WHEN MATCHED THEN
  UPDATE SET b.column2 = a.column2; 

ここでは値を使用しないことに注意してください。必要UPDATEではないようです(その理由を説明する詳細情報を提供することができます)

代わりに、 のすべての行に対して、 の同じ値を持つ のtable1行を検索します。見つからない場合は、が実行されます。ISが1 つ見つかった場合、更新が実行されます。table1column1INSERT


あなたがしていたことは、( a.column3 = 'UPDATE') の場合に一致が見つかったと言っています。これは、 のすべての行が のすべての行と照合されることを意味し、table2の同じ行を の多くの行の値で更新しようとしました。'UPDATE'table1table2table1

a.column3 <> 'UPDATE'また、に挿入されるすべての行table2

于 2012-07-03T05:54:28.617 に答える