2017-06-28 4 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 requêtes Insert sontInsérer ou mise à jour si existe déjà

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) 

Si employee_id = 111 existe déjà devrait mettre à jour les autres il doit insérer. aider Veuillez si quelqu'un sait

+1

Quelle est la logique d'affaires ici? Cela n'a pas de sens. – APC

+0

Donc, si un enregistrement BONUS n'existe pas pour l'employé 111, vous allez ajouter un enregistrement de bonus pour l'employé 115? Bizarre. Si c'est correct alors vous avez un régime de bonus intéressant dans l'entreprise .. – BriteSponge

+0

c'est juste un échantillon, si cette requête de fusion fonctionne, je vais mettre en œuvre pour d'autres travaux. Pls m'aider techniquement ne pas chercher la logique d'affaires ici .. – Mano

Répondre

0

Je pense que ce que vous êtes après est quelque chose comme:

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); 

En aparté, pourquoi vous insérez des chaînes dans les colonnes qui ont généralement un type de données d'une certaine forme de NUMÉRO? Ces colonnes ont-elles vraiment des types de données de chaîne (par exemple VARCHAR2, CHAR, etc.)?

+0

fusionner la requête pour la table de bonus qui insèrent des données si employee_id n'existe pas mettre à jour le bonus existant .. Tout exemple pour cela sera utile, les données n'ont pas d'importance – Mano

+0

C'est ce que je vous ai fourni. – Boneist

0

Quelque chose comme:

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

requête de fusion pour la table de bonus qui insèrent des données si employee_id n'existe pas d'autre mise à jour existante bonus .. – Mano

1

Votre syntaxe est mal tourné. Il devrait être ceci:

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) 
/

Cependant, il n'a pas de sens d'avoir la table cible dans la clause using. Il ne produit pas les résultats que vous pensez que ça va ...

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> 

Peut-être quelque chose comme ça vous convient?

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) 

Si vous ne disposez pas d'une source d'employé ID distinct de la table PRIMES vous pouvez utiliser la table DUAL pour truquer:

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

fusionner requête pour la table de bonus qui insèrent des données si employee_id n'existe pas d'autre mise à jour de bonus existant .. Tout exemple pour cela sera utile, data doesn't matière – Mano