12

現在、クエリ可能なテーブルを常に最新の状態に保つために更新ステートメントを作成しています。スキーマは両方のテーブルで同一であり、内容は重要ではありません。

STAGING  

ID  
NAME  
COUNT    

PRODUCTION  

ID  
NAME  
COUNT

私の更新ステートメントは次のようになります。

update PRODUCTION  
set name = (select stage.name from staging stage where stage.name=name  and rownum <2),  
    count =   (select stage.countfrom staging stage where stage.count=count  and rownum <2);

注意すべき 2 つの点は、1) 更新の最後に where 句がないこと (これが問題である可能性があります)、および 2) 更新後のすべてのレコードが同じ値を持つことです。これが意味することは次のとおりです。

BEFORE UPDATE:  

1,"JOHN", 12;  
2,"STEVE",15;  
3,"BETTY",2;  

AFTER UPDATE  

    1,"JOHN", 12;  
    2,"JOHN",12;  
    3,"JOHN",12;

私の質問は、テーブルがステージングからの「新しい」データを正しい SQL 更新として適切に反映するように、これを修正するにはどうすればよいですか?

アップデート

したがって、私のステージング データは偶然にも内容を反映している可能性がPRODUCTIONあり、議論のために次のようになります。

STAGING DATA TO MERGE:  

    1,"JOHN", 12;  
    2,"STEVE",15;  
    3,"BETTY",2; 

2 番目の更新

実行したいクエリは次のとおりです。

update PRODUCTION
set production.name = staging.name,  
    production.count = staging.count

where production.name = staging.name;

ただし、これにより、「staging.name」で無効な識別子の問題が発生します

4

4 に答える 4

38

あなたがしようとしていることを行うには2つの方法があります

1 つは、複数列の相関更新です。

UPDATE PRODUCTION a
SET (name, count) = (
  SELECT name, count
  FROM STAGING b
  WHERE a.ID = b.ID);

デモ

マージを使用できます

MERGE INTO PRODUCTION a
USING ( select id, name, count 
          from STAGING ) b
ON ( a.id = b.id )
WHEN MATCHED THEN 
UPDATE SET  a.name = b.name,
            a.count = b.count

デモ

于 2012-07-27T18:33:15.947 に答える
3

それを試してみてください ..

UPDATE PRODUCTION a
SET (name, count) = (
SELECT name, count
        FROM STAGING b
        WHERE a.ID = b.ID)
WHERE EXISTS (SELECT 1
    FROM STAGING b
    WHERE a.ID=b.ID
 );
于 2015-12-29T07:11:28.823 に答える
1

お気づきのように、更新ステートメントには選択性がないため、テーブル全体が更新されます。特定の行 (つまり、ID が一致する場所) を更新したい場合は、おそらく調整されたサブクエリを実行する必要があります。

ただし、Oracle を使用しているため、クエリ テーブルのマテリアライズド ビューを作成し、Oracle のトランザクション メカニズムに詳細を処理させる方が簡単な場合があります。MV は、セマンティクスをクエリするためのテーブルとまったく同じように機能し、セットアップが非常に簡単で、更新間隔を指定できます。

于 2012-07-27T17:42:33.640 に答える
1

ステージングのデータセットの例がなければ、これは暗闇の中のショットですが、このようなことを試しましたか?

update PRODUCTION p,
       staging s
set p.name = s.name  
    p.count = s.count
where p.id = s.id

これは、id 列が両方のテーブルで一致すると仮定して機能します。

于 2012-07-27T17:44:18.703 に答える