merge - Syntax

immer wieder gesucht:

MERGE INTO bonuses D
USING (SELECT employee_id, salary, department_id FROM employees
WHERE department_id = 80) S
ON (D.employee_id = S.employee_id)
WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
DELETE WHERE (S.salary > 8000)
WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
VALUES (S.employee_id, S.salary*0.1)
WHERE (S.salary <= 8000);


Quelle: Oracle-10gR2-Doku - http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_9016.htm#SQLRF01606



bzw. etwas ausführlicher (Jan 2012):

Das Kommando ist eigentlich selbsterklärend: Man kann sehr schön die einzelnen Abschnitte erkennen:

  • MERGE INTO ... gibt das Ziel der MERGE-Operation an (typischerweise eine Tabelle)
  • USING ... gibt die Datenquelle an; das kann eine Tabelle, eine View oder eine SELECT-Abfrage, welche Literale "from DUAL" selektiert, sein.
  • ON (matching-kriterium) legt fest, wie bereits vorhandene Zeilen erkannt werden sollen - hier anhand der EMPNO. Aber auch komplerere Kriterien sind möglich.
  • WHEN MATCHED ... legt fest, was passieren soll, wenn die Zeile schon da ist; in diesem Fall soll ein SQL UPDATE erfolgen; die Spalteninhalte der Zieltabelle sollen mit denen der Quelldaten überschrieben werden.
  • WHEN NOT MATCHED ... legt fest, was passieren soll, wenn die Zeile nicht vorhanden ist; in diesem Fall findet ein SQL INSERT statt - die Zeile wird anhand der Quelldaten erzeugt.

MERGE kann jedoch ab Oracle10g noch mehr ... So sollen die Zeilen der DEPTNO 30 nicht mehr in die Zieltabelle gemischt werden. Das sieht dann wie folgt aus:

merge into emp_new dest
using (select * from emp) src
on (src.empno = dest.empno)
when
matched then update set
dest.ename = src.ename,
dest.sal = src.sal,
dest.hiredate = src.hiredate,
dest.job = src.job,
dest.deptno = src.deptno,
dest.comm = src.comm,
dest.mgr = src.mgr
-- ONLY IF DEPTNO IN SOURCE DATA NOT EQUALS "30"
where not src.deptno = 30
when not matched then
insert (empno, ename, sal, comm, mgr, job, hiredate, deptno)
values (src.empno, src.ename, src.sal, src.comm, src.mgr, src.job, src.hiredate, src.deptno)
-- ONLY IF DEPTNO IN SOURCE DATA NOT EQUALS "30"
where not src.deptno = 30
/
Quelle: http://www.oracle.com/webfolder/technetwork/de/community/apex/tipps/sql-merge/index.html

Kommentare

Beliebte Posts aus diesem Blog

PGA unter Oracle 11g

trunc(sysdate) - nette Spiele mit dem Datum

Datapump - Verzeichnis erstellen