DML語句中MERGE的用法


    把數據從一個表複製到另外一個表,插入新數據或替換掉老數據是每個ORACLE DBA都會常常碰到的問題。oracle

    在ORACLE9i之前的年代,咱們要先查找是否存在老數據,若是有用UPDATE替換,不然用INSERT語句插入,其間少不了還有一些標記變量等等,繁瑣的很。ide

    如今ORACLE9i專爲這種狀況提供了MERGE語句,使這一工做變得異常輕鬆,Oracle9i引入了MERGE命令,你可以在一個SQL語句中對一個表同時執行inserts和updates操做. MERGE命令從一個或多個數據源中選擇行來updating或inserting到一個或多個表.視頻


Oracle 10g中MERGE有以下一些改進:教程


一、UPDATE或INSERT子句是可選的get

二、UPDATE和INSERT子句能夠加WHERE子句產品

三、ON條件中使用常量過濾謂詞來insert全部的行到目標表中,不須要鏈接源表和目標表it

四、UPDATE子句後面能夠跟DELETE子句來去除一些不須要的行table


首先建立示例表:class


create table PRODUCTS變量

   (

   PRODUCT_ID INTEGER,

   PRODUCT_NAME VARCHAR2(60),

   CATEGORY VARCHAR2(60)

   );


   insert into PRODUCTS values (1501, 'VIVITAR 35MM', 'ELECTRNCS');

   insert into PRODUCTS values (1502, 'OLYMPUS IS50', 'ELECTRNCS');

   insert into PRODUCTS values (1600, 'PLAY GYM', 'TOYS');

   insert into PRODUCTS values (1601, 'LAMAZE', 'TOYS');

   insert into PRODUCTS values (1666, 'HARRY POTTER', 'DVD');

   commit;


create table NEWPRODUCTS

   (

   PRODUCT_ID INTEGER,

   PRODUCT_NAME VARCHAR2(60),

   CATEGORY VARCHAR2(60)

   );


   insert into NEWPRODUCTS values (1502, 'OLYMPUS CAMERA', 'ELECTRNCS');

   insert into NEWPRODUCTS values (1601, 'LAMAZE', 'TOYS');

   insert into NEWPRODUCTS values (1666, 'HARRY POTTER', 'TOYS');

   insert into NEWPRODUCTS values (1700, 'WAIT INTERFACE', 'BOOKS');

   commit;



一、可省略的UPDATE或INSERT子句


    在Oracle 9i, MERGE語句要求你必須同時指定INSERT和UPDATE子句.而在Oracle 10g, 你能夠省略UPDATE或INSERT子句中的一個.

下面的例子根據表NEWPRODUCTS的PRODUCT_ID字段是否匹配來updates表PRODUCTS的信息:


MERGE INTO products p

   USING newproducts np

   ON (p.product_id = np.product_id)

   WHEN MATCHED THEN

   UPDATE

   SET p.product_name = np.product_name,

       p.category = np.category

/


   SQL> SELECT * FROM products;


   PRODUCT_ID PRODUCT_NAME CATEGORY

   ---------- -------------------- ----------

   1501 VIVITAR 35MM ELECTRNCS

   1502 OLYMPUS CAMERA ELECTRNCS

   1600 PLAY GYM TOYS

   1601 LAMAZE TOYS

   1666 HARRY POTTER TOYS

   SQL>

   SQL> ROLLBACK;

   Rollback complete.

   SQL>


在上面例子中, MERGE語句影響到是產品id爲1502, 1601和1666的行. 它們的產品名字和種 類被更新爲表newproducts中的值.

下面例子省略UPDATE子句, 把表NEWPRODUCTS中新的PRODUCT_ID插入到表PRODUCTS中, 對於在兩個表中可以匹配上PRODUCT_ID的數據不做任何處理.

從這個例子你能看到PRODUCT_ID=1700的行被插入到表PRODUCTS中.


SQL> MERGE INTO products p

   2 USING newproducts np

   3 ON (p.product_id = np.product_id)

   4 WHEN NOT MATCHED THEN

   5 INSERT

   6 VALUES (np.product_id, np.product_name,

   7 np.category);


   1 row merged.


   SQL> SELECT * FROM products;


   PRODUCT_ID PRODUCT_NAME CATEGORY

   ---------- -------------------- ----------

   1501 VIVITAR 35MM ELECTRNCS

   1502 OLYMPUS IS50 ELECTRNCS

   1600 PLAY GYM TOYS

   1601 LAMAZE TOYS

   1666 HARRY POTTER DVD

   1700 WAIT INTERFACE BOOKS


二、帶條件的Updates和Inserts子句


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



SQL> MERGE INTO products p

   2 USING newproducts np

   3 ON (p.product_id = np.product_id)

   4 WHEN MATCHED THEN

   5 UPDATE

   6 SET p.product_name = np.product_name

   7 WHERE p.category = np.category;


   2 rows merged.


   SQL> SELECT * FROM products;


   PRODUCT_ID PRODUCT_NAME CATEGORY

   ---------- -------------------- ----------

   1501 VIVITAR 35MM ELECTRNCS

   1502 OLYMPUS CAMERA ELECTRNCS

   1600 PLAY GYM TOYS

   1601 LAMAZE TOYS

   1666 HARRY POTTER DVD

   SQL>

   SQL> rollback;


在這個例子中, 產品ID爲1502,1601和1666匹配ON條件可是1666的category不匹配. 所以MERGE命令只更新兩行數據. 下面例子展現了在Updates和Inserts子句都使用WHERE子句:


SQL> MERGE INTO products p

   2 USING newproducts np

   3 ON (p.product_id = np.product_id)

   4 WHEN MATCHED THEN

   5 UPDATE

   6 SET p.product_name = np.product_name,

   7 p.category = np.category

   8 WHERE p.category = 'DVD'

   9 WHEN NOT MATCHED THEN

   10 INSERT

   11 VALUES (np.product_id, np.product_name, np.category)

   12 WHERE np.category != 'BOOKS'

   SQL> /


   1 row merged.


   SQL> SELECT * FROM products;


   PRODUCT_ID PRODUCT_NAME CATEGORY

   ---------- -------------------- ----------

   1501 VIVITAR 35MM ELECTRNCS

   1502 OLYMPUS IS50 ELECTRNCS

   1600 PLAY GYM TOYS

   1601 LAMAZE TOYS

   1666 HARRY POTTER TOYS


   SQL>


注意因爲有WHERE子句INSERT沒有插入全部不匹配ON條件的行到表PRODUCTS.


三、無條件的Inserts


    你可以不用鏈接源表和目標表就把源表的數據插入到目標表中. 這對於你想插入全部行到目標表時是很是有用的. Oracle 10g如今支持在ON條件中使用常量過濾謂詞. 舉個常量過濾謂詞例子ON (1=0). 下面例子從源表插入行到表PRODUCTS, 不檢查這些行是否在表PRODUCTS中存在:


SQL> MERGE INTO products p

   2 USING newproducts np

   3 ON (1=0)

   4 WHEN NOT MATCHED THEN

   5 INSERT

   6 VALUES (np.product_id, np.product_name, np.category)

   7 WHERE np.category = 'BOOKS'

   SQL> /


   1 row merged.


   SQL> SELECT * FROM products;


   PRODUCT_ID PRODUCT_NAME CATEGORY

   ---------- -------------------- ----------

   1501 VIVITAR 35MM ELECTRNCS

   1502 OLYMPUS IS50 ELECTRNCS

   1600 PLAY GYM TOYS

   1601 LAMAZE TOYS

   1666 HARRY POTTER DVD

   1700 WAIT INTERFACE BOOKS

   6 rows selected.

   SQL>


四、新增長的DELETE子句


    Oracle 10g中的MERGE提供了在執行數據操做時清除行的選項. 你可以在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必須有一個WHERE條件來刪除匹配某些條件的行.匹配DELETE WHERE條件但不匹配ON條件的行不會被從表中刪除.


下面例子驗證DELETE子句. 咱們從表NEWPRODUCTS中合併行到表PRODUCTS中, 但刪除category爲ELECTRNCS的行.


SQL> MERGE INTO products p

   2 USING newproducts np

   3 ON (p.product_id = np.product_id)

   4 WHEN MATCHED THEN

   5 UPDATE

   6 SET p.product_name = np.product_name,

   7 p.category = np.category

   8 DELETE WHERE (p.category = 'ELECTRNCS')

   9 WHEN NOT MATCHED THEN

   10 INSERT

   11 VALUES (np.product_id, np.product_name, np.category)

   SQL> /


   4 rows merged.


   SQL> SELECT * FROM products;


   PRODUCT_ID PRODUCT_NAME CATEGORY

   ---------- -------------------- ----------

   1501 VIVITAR 35MM ELECTRNCS

   1600 PLAY GYM TOYS

   1601 LAMAZE TOYS

   1666 HARRY POTTER TOYS

   1700 WAIT INTERFACE BOOKS

   SQL>


    產品ID爲1502的行從表PRODUCTS中被刪除, 由於它同時匹配ON條件和DELETE WHERE條件. 產品ID爲1501的行匹配DELETE WHERE條件但不匹配ON條件, 因此它沒有被刪除. 產品ID爲1700 的行不匹配ON條件, 因此被插入表PRODUCTS. 產品ID爲1601和1666的行匹配ON條件但不匹配DELETE WHERE條件, 因此被更新爲表NEWPRODUCTS中的值.



oracle視頻教程請關注:http://down.51cto.com/4202939/up

相關文章
相關標籤/搜索