天天看點

Oracle Merge Into 用法詳解

Oracle9i引入了MERGE指令,你能夠在一個SQL語句中對一個表同時執行inserts和updates操作. MERGE指令從一個或多個資料源中選擇行來updating或inserting到一個或多個表.

Oracle 10g中MERGE有如下一些改進:

UPDATE或INSERT子句是可選的

UPDATE和INSERT子句可以加WHERE子句

ON條件中使用常量過濾謂詞來insert所有的行到目标表中,不需要連接配接源表和目标表

UPDATE子句後面可以跟DELETE子句來去除一些不需要的行

首先建立示例表:

在Oracle 9i, MERGE語句要求你必須同時指定INSERT和UPDATE子句.而在Oracle 10g, 你可以省略UPDATE或INSERT子句中的一個. 下面的例子根據表NEWPRODUCTS的PRODUCT_ID字段是否比對來updates表PRODUCTS的資訊:

在上面例子中, MERGE語句影響到是産品id為1502, 1601和1666的行. 它們的産品名字和種 類被更新為表newproducts中的值. 下面例子省略UPDATE子句, 把表NEWPRODUCTS中新的PRODUCT_ID插入到表PRODUCTS中, 對于在兩個表中能夠比對上PRODUCT_ID的資料不作任何處理. 從這個例子你能看到PRODUCT_ID=1700的行被插入到表PRODUCTS中.

你能夠添加WHERE子句到UPDATE或INSERT子句中去, 來跳過update或insert操作對某些行的處理. 下面例子根據表NEWPRODUCTS來更新表PRODUCTS資料, 但必須字段CATEGORY也得同時比對上:

在這個例子中, 産品ID為1502,1601和1666比對ON條件但是1666的category不比對. 是以MERGE指令隻更新兩行資料. 下面例子展示了在Updates和Inserts子句都使用WHERE子句:

注意由于有WHERE子句INSERT沒有插入所有不比對ON條件的行到表PRODUCTS.

你能夠不用連接配接源表和目标表就把源表的資料插入到目标表中. 這對于你想插入所有行到目标表時是非常有用的. Oracle 10g現在支援在ON條件中使用常量過濾謂詞. 舉個常量過濾謂詞例子ON (1=0). 下面例子從源表插入行到表PRODUCTS, 不檢查這些行是否在表PRODUCTS中存在:

Oracle 10g中的MERGE提供了在執行資料操作時清除行的選項. 你能夠在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必須有一個WHERE條件來删除比對某些條件的行.比對DELETE WHERE條件但不比對ON條件的行不會被從表中删除.

下面例子驗證DELETE子句. 我們從表NEWPRODUCTS中合并行到表PRODUCTS中, 但删除category為ELECTRNCS的行.

産品ID為1502的行從表PRODUCTS中被删除, 因為它同時比對ON條件和DELETE WHERE條件. 産品ID為1501的行比對DELETE WHERE條件但不比對ON條件, 是以它沒有被删除. 産品ID為1700 的行不比對ON條件, 是以被插入表PRODUCTS. 産品ID為1601和1666的行比對ON條件但不比對DELETE WHERE條件, 是以被更新為表NEWPRODUCTS中的值.