2017-06-28 6 views
-2
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(115) 

Table`s挿入クエリは挿入または更新済み= 111をEMPLOYEE_ID場合

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) 

ある存在している場合は、すでにそれはそうでなければ挿入する必要があり を更新する必要がありますが存在します。 が親切に誰かが

+1

ここでビジネスロジックとは何ですか?それは意味をなさない。 – APC

+0

従業員111のBONUSレコードが存在しない場合、従業員115のボーナスレコードが追加されますか?奇妙な。もしそれが正しければ、あなたは会社内で面白いボーナス制度を持っています。 – BriteSponge

+0

これは単なるサンプルです。このマージクエリーがうまくいくなら私は他の仕事のために実装するつもりです。 Plsは技術的にここでビジネスロジックを探しません。 – Mano

答えて

0

を知っていれば、私はあなたが後にしているものを考えるのを助けることのようなものです:余談として

merge into bonuses tgt 
using (select '111' employee_id, '555' bonus from dual) src 
    on (tgt.employee_id = src.employee_id) 
WHEN MATCHED THEN 
    update set tgt.bonus = src.bonus 
WHEN NOT MATCHED THEN 
    insert (tgt.employee_id, tgt.bonus) 
    values (src.employee_id, src.bonus); 

、なぜあなたは通常、NUMBERのいくつかのフォームのデータ型を持つ列に文字列を挿入していますか?これらの列に実際に文字列データ型(VARCHAR2、CHARなど)がありますか?以下のような

+0

employee_idが存在しない場合にデータを挿入するボーナステーブルのマージクエリーその他の既存のボーナスを更新する。これに関する任意の例が役立ちます。データは問題ありません – Mano

+0

これは私があなたに提供したものです。 – Boneist

0

何か:

MERGE INTO bonuses dst 
USING (SELECT '111' AS employee_id, '555' AS bonus FROM DUAL) src 
ON (dst.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

employee_idが存在しない場合にデータを挿入するボーナステーブルのマージクエリ。 – Mano

1

あなたの構文がゆがんであります。

merge into bonuses b 
using(select * from bonuses) s 
ON (s.employee_id = 115) 
WHEN MATCHED THEN update set bonus='555' 
WHEN NOT MATCHED THEN insert(employee_id) values(115) 
/

しかし、それはusing句でターゲット表を持ってしても意味がありません:それは、このする必要があります。それはあなたがそれが起こっていると思う結果を生成しません...

SQL> select * from bonuses; 

EMPLOYEE_ID  BONUS 
----------- ---------- 
     111 
     112 
     113 
     114 
     115 

5 rows selected. 

SQL> merge into bonuses b 
    2 using(select * from bonuses) s 
    3 ON (s.employee_id = 115) 
    4 WHEN MATCHED THEN update set bonus='555' 
    5 WHEN NOT MATCHED THEN insert (employee_id) values(115) 
    6/ 

9 rows merged. 

SQL> select * from bonuses; 

EMPLOYEE_ID  BONUS 
----------- ---------- 
     111  555 
     112  555 
     113  555 
     114  555 
     115  555 
     115 
     115 
     115 
     115 

9 rows selected. 

SQL> 

多分これはあなたに合っていますか?

merge into bonuses b 
using(select * from employees) e 
    ON (b.employee_id = e.employee_id) 
WHEN MATCHED THEN 
    update set bonus= 555 
WHEN NOT MATCHED THEN 
    insert (employee_id) values (e.id) 

あなたはそれが偽物にDUAL表を使用することができますボーナステーブルは異なる従業員IDのソースを持っていない場合:

SQL> merge into bonuses b 
    2 using(select 115 as employee_id, 555 as bonus from dual union all 
    3   select 116 as employee_id, 555 as bonus from dual) e 
    4  ON (b.employee_id = e.employee_id) 
    5 WHEN MATCHED THEN 
    6  update set bonus= e.bonus 
    7 WHEN NOT MATCHED THEN 
    8  insert (employee_id) values (e.employee_id) 
    9/

2 rows merged. 

SQL> select * from bonuses; 

EMPLOYEE_ID  BONUS 
----------- ---------- 
     111 
     112 
     113 
     114 
     115  555 
     116 

6 rows selected. 

SQL> 
+0

既存のボーナスを更新するボーナステーブルのマージクエリ。問題 – Mano

関連する問題