Oracle9i引入了一個新的SQL語句,使用本語句可以在一條語句中串連兩個表。
以前要使用UPDATE去更新兩個表中都存在的記錄,或者用INSERT添加兩個合并表中不存在的記錄,必須寫兩個SQL語句,
而現在這兩種操作都只要一條SQL MERGE語句就可以實現。
create table inventory (part_nointeger integer,part_count integer);
insert into inventory values(1,5);
insert into inventory values(3,6);
create table shipment (part_nointeger integer,part_count integer);
insert into shipment values(1,2);
insert into shipment values(2,2);
MERGE INTO inventory
USING shipment
ON (inventory.part_nointeger=shipment.part_nointeger)
WHEN MATCHED THEN
UPDATE SET inventory.part_count=inventory.part_count+shipment.part_count --注意如果這裡前面的part_count欄位不指明表名,預設為shipment欄位,結果會為4
WHEN NOT MATCHED THEN
INSERT VALUES (shipment.part_nointeger,shipment.part_count);
commit;
select * from inventory;
truncate table inventory;
/**//*
PART_NO PART_COUNT
---------- ----------
1 7
3 6
2 2
執行的結果是shipment資料已經被合并到inventory中,所以與inventory中某些東西相匹配的shipment都會被添加到count中,
而沒有得到的匹配的就不會添加到inventory中。
在MERGE語句中必須指定一個WHEN MATCHED和一個WHEN NOT MATHCED語句。
如果除這兩種情況之外還有別的情況,你可能就需要使用一個常規的INSERT或者UPDATE語句。
另外一點是MERGE語句一次只能修改一行記錄,而且不能修改在ON子句中引用的列。
MERGE語句的目標表(target table)(在本例中是inventory)必須是一個可以使用INSERT語句進行插入或者UPDATE語句進行更新的表或者視圖。
源表(source table)(在本例中是shipment)可以是任何的查詢表,比如說外部表格或者管道化表函數。