3

私はMERGESQLステートメントに頭を悩ませようとしています。私が達成したいのは:

テーブルに新しい値を挿入しますが、レコードがすでに存在する場合は列をCSScolorOrders更新しますcorQuantitycolIDordID

これは私が最終的に得たものです:

MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
ON (SOURCE.colID = 1) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);

残念ながら例外は発生しないので、なぜ機能しないのかわかりません。

4

4 に答える 4

6

ここで説明したように、マージがまさにそのとおりであることがわかります。2 つのテーブルを取得し、それらを結合した値を検索することを "X" と呼びます。X が一致する場合、そのレコードに対して更新を実行します。存在しない場合は、選択した値を使用してターゲット テーブルで挿入を実行します。

あなたの場合、あなたが参加するかどうかは完全にはわかりません

  (  ON (SOURCE.colID = 1)   )

正しい。私はこれが必要だと確信しています

on(Source.colID = Target.colID)

したがって、完全なステートメントは次のようになります。

MERGE INTO CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
on(Source.colID = Target.colID)
WHEN MATCHED THEN 
  UPDATE SET corQuantity = 1 
WHEN NOT MATCHED BY TARGET
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);

しかし、私はこれをテストしておらず、テーブルの列が何であり、正確に何を結合しようとしているのかを100%確信していません. しかし、私が提供したリンクは、あなたを正しい方向に向けるはずです.

お役に立てれば!

于 2012-05-24T16:46:24.670 に答える
4
MERGE INTO accounting_values AS Target
USING (select @entity_id as entity_id, @fiscal_year as fiscal_year, @fiscal_period as       fiscal_period) AS source
ON (target.entity_id = source.entity_id  AND target.fiscal_year = source.fiscal_year AND target.fiscal_period = source.fiscal_period)
WHEN MATCHED THEN
    UPDATE SET value = @value
WHEN NOT MATCHED BY Target THEN
    INSERT 
(entity_id, fiscal_year, fiscal_period, value) 
    VALUES (@entity_ID, @fiscal_year, @fiscal_period, @value);

これはテスト済みです。テーブルを 2 回参照することはありません。MySQLのON DUPLICATE KEY UPDATEを複製しようとしていました。

于 2014-05-28T22:00:50.173 に答える
1
MERGE CSScolorOrders AS TARGET 
USING (SELECT * FROM CSScolorOrders WHERE ordID = 3) AS SOURCE 
ON (SOURCE.colID = TARGET.colID) WHEN 
MATCHED THEN UPDATE SET corQuantity = 1 
WHEN
  NOT MATCHED
  THEN INSERT (colID, ordID, corQuantity) VALUES (1, 3, 1);
于 2012-05-24T16:47:12.347 に答える