2017-06-29 14 views
0
CREATE TABLE bonuses (employee_id NUMBER, bonus NUMBER DEFAULT 100); 

このcreate tableクエリ。既に存在する場合はローを更新else else

件のデータを挿入するには:

INSERT INTO bonuses (employee_id) VALUES(111) 
INSERT INTO bonuses (employee_id) VALUES(112) 
INSERT INTO bonuses (employee_id) VALUES(113) 
INSERT INTO bonuses (employee_id) VALUES(114) 
INSERT INTO bonuses (employee_id) VALUES(115) 

それは employee_id=111

私はエラーを取得していますボーナスの値を変更する必要があり

merge into bonuses 
using(SELECT * FROM bonuses)s ON s.employee_id = 111 
WHEN MATCHED THEN update set bonus='555' 
WHEN NOT MATCHED THEN insert insert into BONUSES (employee_id) values(116) 

を挿入または更新のいずれかのために使用マージ問合せにしようこれを実行しながら。 これは単なるサンプルテーブルです。merge execをテストするために作成しました。

+1

'挿入挿入 '?? –

+0

「これを実行している間にエラーが発生していますが、私はこれをあなたのためのパズルとして残し、それによって私を助けるのをより困難にしています。 –

+0

ええ、私は助けを求めて来たので、エラーが発生しています – Mano

答えて

0

これは非常に間違っています。 USING句では、更新/挿入のソースを指定することになっています。だからあなたは主に "私はボーナステーブルのデータでボーナスを更新したい"と言っています。したがって、テーブル内のすべてのレコードに対して、挿入するか更新するかをチェックします。

代わりにダミーの単一ソースレコードを使用してください。 (そしてMERGEON句は括弧が必要です。)

MERGE INTO bonuses 
USING (SELECT * FROM dual) s ON (bonuses.employee_id = 111) 
WHEN MATCHED THEN UPDATE SET bonus = '555' 
WHEN NOT MATCHED THEN INSERT (employee_id) VALUES (116); 

それはあなたが、インサートにボーナスを設定しないこと、しかし驚きです。 (。そして、それは現在のインサート 1つの従業員IDを確認するためにもまれなケースだとそうでない場合)

ここでは、より一般的なクエリですが、これは唯一の従業員ID 111に影響を与えます。

MERGE INTO bonuses 
USING (SELECT 111 as employee_id, 555 as bonus FROM dual) src 
    ON (bonuses.employee_id = src.employee_id) 
WHEN MATCHED THEN UPDATE SET bonus = src.bonus 
WHEN NOT MATCHED THEN INSERT (employee_id, bonus) VALUES (src.employee_id, src.bonus); 
+0

pls私にマージクエリーや他の方法で挿入または更新する場合は、私は実際のシナリオの手順でそのようなクエリがたくさんあるため、すでに存在する場合は選択カウントを使用することはできません、カウントを選択することはできません。 – Mano

+0

わかりません。 'MERGE'文が必要です。私はあなたのことを訂正しました。これは「COUNT」と何が関係していますか? –

+0

行の一致を数えずに挿入または更新する代わりに、私はマージに行きました。 – Mano

関連する問題