[DB][Oracle]如何用一个SQL文实现Insert/Update/Delete和--MERGE命令详解

本文详细介绍了Oracle10g中的MERGE命令如何在一个SQL语句中实现Insert、Update和Delete操作。通过示例展示了可选的UPDATE/INSERT子句、带条件的更新与插入、无条件插入及新增的DELETE子句等功能。
如何用一个SQL文实现Insert/Update/Delete和--MERGE命令
Oracle9i引入了MERGE命令,你能在一个SQL句中一个表同时执insertsupdates操作. MERGE命令从一个或多个数据源中选择行来updatinginserting到一个或多个表.Oracle 10gMERGE有如下一些改
1UPDATEINSERT子句是可
2UPDATEINSERT子句可以加WHERE子句
3、在ON条件中使用常量过滤谓词insert所有的行到目表中,不需要接源表和目
4UPDATE子句后面可以跟DELETE子句来去除一些不需要的行
首先建示例表:
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;
1、可省略的UPDATEINSERT子句
Oracle 9i, MERGE句要求你必指定INSERTUPDATE子句.而在Oracle 10g, 你可以省略UPDATEINSERT子句中的一个. 下面的例子根据表NEWPRODUCTSPRODUCT_ID字段是否匹配来updatesPRODUCTS的信息:
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;
 
    3 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 TOYS
    SQL>
    SQL> ROLLBACK;
    Rollback complete.
    SQL>
在上面例子中, MERGE句影响到是id1502, 16011666的行. 品名字和被更新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
 
2条件的UpdatesInserts子句
你能添加WHERE子句到UPDATEINSERT子句中去, 来跳updateinsert操作某些行的. 下面例子根据表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;
个例子中, ID1502,16011666匹配ON条件但是1666category不匹配. 因此MERGE命令只更新两行数据. 下面例子展示了在UpdatesInserts子句都使用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.
3、无条件的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>
4、新增加的DELETE子句
Oracle 10g中的MERGE提供了在行数据操作清除行的选项. 你能WHEN MATCHED THEN UPDATE子句中包含DELETE子句. DELETE子句必有一个WHERE条件来除匹配某些条件的行.匹配DELETE WHERE条件但不匹配ON条件的行不会被从表中.
下面例子验证DELETE子句. 从表NEWPRODUCTS中合并行到表PRODUCTS, categoryELECTRNCS的行.
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>
ID1502的行从表PRODUCTS中被, 它同匹配ON条件和DELETE WHERE条件. ID1501的行匹配DELETE WHERE条件但不匹配ON条件, 所以它没有被. ID1700 的行不匹配ON条件, 所以被插入表PRODUCTS. ID16011666的行匹配ON条件但不匹配DELETE WHERE条件, 所以被更新NEWPRODUCTS中的.
 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值