See Advanced/Expert SQL, See Exceptions in Pl/Sql
Merge over a single table with insert and/or update
merge into ORA_FILESYSTEM a using
(
select id from (
select id from ORA_FILESYSTEM where de_mounted_on='culo' and id_host=201517
union all
select null id from dual
) where rownum = 1
) t
on (a.id=t.id)
--remove the following line to avoid updates
WHEN MATCHED THEN UPDATE SET a.n_kbytes=100
WHEN NOT MATCHED THEN INSERT (a.id, a.de_Filesystem, a.n_kbytes, a.n_used, a.n_avail, a.perc_capacity, a.de_Mounted_on, a.id_host)
VALUES (1, 'mova', 1, 2, 3, 4, 'culo', 201517); |
A clear example here:
CREATE TABLE TECH_MERGE_ACCOUNT ( ID_ACCOUNT INTEGER, COGNOME VARCHAR2(20 BYTE), BALANCE NUMBER ) |
CREATE TABLE TECH_MERGE_NEW_TRANSACTION ( ID_ACCOUNT INTEGER, AMOUNT NUMBER ) |
| INSERT INTO ALDO.TECH_MERGE_ACCOUNT ( ID_ACCOUNT, COGNOME, BALANCE) VALUES ( 1, 'FADALTI', null); INSERT INTO ALDO.TECH_MERGE_ACCOUNT ( INSERT INTO ALDO.TECH_MERGE_NEW_TRANSACTION ( INSERT INTO ALDO.TECH_MERGE_NEW_TRANSACTION ( INSERT INTO ALDO.TECH_MERGE_NEW_TRANSACTION ( |
MERGE INTO tech_merge_account a USING ( SELECT id_account, sum(amount) sum_amount FROM tech_merge_new_transaction GROUP BY id_account ) t ON (a.id_account=t.id_account) WHEN MATCHED THEN UPDATE SET a.balance = nvl(a.balance, 0) + t.sum_amount WHEN NOT MATCHED THEN INSERT (a.id_account,a.balance) VALUES (t.id_account,t.sum_amount); |