精华内容
下载资源
问答
  • oracle merge 用法详解

    2012-02-29 15:36:20
    oracle merge 用法详解
  • ORACLE merge用法详解

    2017-11-15 13:09:00
    Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle10g中MERGE有如下一些改进: 1、UPDATE...
    Oracle9i引入了MERGE命令,你能够在一个 SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle  10g中MERGE有如下一些改进:

    1、UPDATE或INSERT子句是可选的
    2、UPDATE和INSERT子句可以加WHERE子句
    3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表
    4、UPDATE子句后面可以跟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、可省略的UPDATE或INSERT子句
    在Oracle 9i, MERGE语句要求你必须同时指定INSERT和UPDATE子句.而在Oracle 10g, 你可以省略UPDATE或INSERT子句中的一个. 下面的例子根据表NEWPRODUCTS的PRODUCT_ID字段是否匹配来updates表PRODUCTS的信息:
    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语句影响到是产品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
    2、带条件的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> 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.
    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中, 但删除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中的值.



    本文转自einyboy博客园博客,原文链接:http://www.cnblogs.com/einyboy/archive/2012/08/01/2617769.html ,如需转载请自行联系原作者。
    展开全文
  • Oracle 10g之前,merge语句支持匹配更新和不匹配插入2种简单的用法,在10g中Oraclemerge语句做了增强,增加了条件选项和DELETE操作。下面我通过一个demo来简单介绍一下10g中merge的增强和10g前merge用法。 ...
    在Oracle 10g之前,merge语句支持匹配更新和不匹配插入2种简单的用法,在10g中Oracle对merge语句做了增强,增加了条件选项和DELETE操作。下面我通过一个demo来简单介绍一下10g中merge的增强和10g前merge的用法。
     
    参考Oracle 的SQL Reference,大家可以看到Merge Statement的语法如下:
    MERGE [hint] INTO [schema .] table [t_alias] USING [schema .]
    { table | view | subquery } [t_alias] ON ( condition )
    WHEN MATCHED THEN merge_update_clause
    WHEN NOT MATCHED THEN merge_insert_clause;

    下面我在windows xp 下10.2.0.1版本上做一个测试看看

    SQL> select * from v$version;

    BANNER
    ----------------------------------------------------------------
    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
    PL/SQL Release 10.2.0.1.0 - Production
    CORE 10.2.0.1.0 Production
    TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
    NLSRTL Version 10.2.0.1.0 - Production

    SQL>
    一、创建测试用的表
    SQL> create table subs(msid number(9),
    2 ms_type char(1),
    3 areacode number(3)
    4 );

    表已创建。

    SQL> create table acct(msid number(9),
    2 bill_month number(6),
    3 areacode number(3),
    4 fee number(8,2) default 0.00);

    表已创建。

    SQL>
    SQL> insert into subs values(905310001,0,531);

    已创建 1 行。

    SQL> insert into subs values(905320001,1,532);

    已创建 1 行。

    SQL> insert into subs values(905330001,2,533);

    已创建 1 行。

    SQL> commit;

    提交完成。

    SQL>
     

    二、下面先演示一下merge的基本功能

    1) matched 和not matched clauses 同时使用
    merge into acct a
    using subs b on (a.msid=b.msid)
    when MATCHED then
    update set a.areacode=b.areacode
    when NOT MATCHED then
    insert(msid,bill_month,areacode)
    values(b.msid,'200702',b.areacode);
    2) 只有not matched clause,也就是只插入不更新
    merge into acct a
    using subs b on (a.msid=b.msid)
    when NOT MATCHED then
    insert(msid,bill_month,areacode)
    values(b.msid,'200702',b.areacode);

    3) 只有matched clause, 也就是只更新不插入
    merge into acct a
    using subs b on (a.msid=b.msid)
    when MATCHED then
    update set a.areacode=b.areacode

    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    Connected as study

    SQL> select * from subs;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905310001 0 531
    905320001 1 532
    905330001 2 533

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------

    SQL>
    SQL> merge into acct a
    2 using subs b on (a.msid=b.msid)
    3 when MATCHED then
    4 update set a.areacode=b.areacode
    5 when NOT MATCHED then
    6 insert(msid,bill_month,areacode)
    7 values(b.msid,'200702',b.areacode);

    Done

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905320001 200702 532 0.00
    905330001 200702 533 0.00
    905310001 200702 531 0.00

    SQL> insert into subs values(905340001,3,534);

    1 row inserted

    SQL> select * from subs;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905340001 3 534
    905310001 0 531
    905320001 1 532
    905330001 2 533

    SQL>
    SQL> merge into acct a
    2 using subs b on (a.msid=b.msid)
    3 when NOT MATCHED then
    4 insert(msid,bill_month,areacode)
    5 values(b.msid,'200702',b.areacode);

    Done

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905320001 200702 532 0.00
    905330001 200702 533 0.00
    905310001 200702 531 0.00
    905340001 200702 534 0.00

    SQL> update subs set areacode=999;

    4 rows updated

    SQL> select * from subs;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905340001 3 999
    905310001 0 999
    905320001 1 999
    905330001 2 999

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905320001 200702 532 0.00
    905330001 200702 533 0.00
    905310001 200702 531 0.00
    905340001 200702 534 0.00

    SQL>
    SQL> merge into acct a
    2 using subs b on (a.msid=b.msid)
    3 when MATCHED then
    4 update set a.areacode=b.areacode;

    Done

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905320001 200702 999 0.00
    905330001 200702 999 0.00
    905310001 200702 999 0.00
    905340001 200702 999 0.00

    SQL>
     
    三、10g中增强一:条件操作

    1) matched 和not matched clauses 同时使用
    merge into acct a
    using subs b on (a.msid=b.msid)
    when MATCHED then
    update set a.areacode=b.areacode
    where b.ms_type=0
    when NOT MATCHED then
    insert(msid,bill_month,areacode)
    values(b.msid,'200702',b.areacode)
    where b.ms_type=0;
    2) 只有not matched clause,也就是只插入不更新
    merge into acct a
    using subs b on (a.msid=b.msid)
    when NOT MATCHED then
    insert(msid,bill_month,areacode)
    values(b.msid,'200702',b.areacode)
    where b.ms_type=0;

    3) 只有matched clause, 也就是只更新不插入
    merge into acct a
    using subs b on (a.msid=b.msid)
    when MATCHED then
    update set a.areacode=b.areacode
    where b.ms_type=0;


    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.1.0
    Connected as study

    SQL> select * from subs;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905310001 0 531
    905320001 1 532
    905330001 2 533

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------

    SQL>
    SQL> merge into acct a
    2 using subs b on (a.msid=b.msid)
    3 when MATCHED then
    4 update set a.areacode=b.areacode
    5 where b.ms_type=0
    6 when NOT MATCHED then
    7 insert(msid,bill_month,areacode)
    8 values(b.msid,'200702',b.areacode)
    9 where b.ms_type=0;

    Done

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905310001 200702 531 0.00

    SQL> insert into subs values(905360001,0,536);

    1 row inserted

    SQL> select * from subs;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905360001 0 536
    905310001 0 531
    905320001 1 532
    905330001 2 533

    SQL>
    SQL> merge into acct a
    2 using subs b on (a.msid=b.msid)
    3 when NOT MATCHED then
    4 insert(msid,bill_month,areacode)
    5 values(b.msid,'200702',b.areacode)
    6 where b.ms_type=0;

    Done

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905310001 200702 531 0.00
    905360001 200702 536 0.00

    SQL> update subs set areacode=888 where ms_type=0;

    2 rows updated

    SQL> select * from subs;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905360001 0 888
    905310001 0 888
    905320001 1 532
    905330001 2 533

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905310001 200702 531 0.00
    905360001 200702 536 0.00

    SQL>
    SQL> merge into acct a
    2 using subs b on (a.msid=b.msid)
    3 when MATCHED then
    4 update set a.areacode=b.areacode
    5 where b.ms_type=0;

    Done

    SQL> select * from acct;

    MSID BILL_MONTH AREACODE FEE
    ---------- ---------- -------- ----------
    905310001 200702 888 0.00
    905360001 200702 888 0.00

    SQL>
    四、10g中增强二:删除操作
    An optional DELETE WHERE clause can be used to clean up after a
    merge operation. Only those rows which match both the ON clause
    and the DELETE WHERE clause are deleted.

    merge into acct a
    using subs b on (a.msid=b.msid)
    when MATCHED then
    update set a.areacode=b.areacode
    delete where (b.ms_type!=0);

    SQL> select * from subs;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905310001 0 531
    905320001 1 532
    905330001 2 533

    SQL> select * from acct;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905310001 0 531
    905320001 1 532
    905330001 2 533

    SQL>
    SQL> merge into acct a
    2 using subs b on (a.msid=b.msid)
    3 when MATCHED then
    4 update set a.areacode=b.areacode
    5 delete where (b.ms_type!=0);

    Done

    SQL> select * from acct;

    MSID MS_TYPE AREACODE
    ---------- ------- --------
    905310001 0 531

    SQL>

    转载于:https://my.oschina.net/sucre/blog/296294

    展开全文
  • oracle merge用法详解

    千次阅读 2009-10-20 22:22:00
    Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates...在Oracle 10g中MERGE有如下一些改进: 1、UPDATE或INSERT子句是可选的 2、UPDATE和INSERT子句可以加WHERE子句 3、在ON条件中使用

    Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进:

     

    1、UPDATE或INSERT子句是可选的

    2、UPDATE和INSERT子句可以加WHERE子句

    3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表

    4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行

     

    首先创建示例表

     

    1、可省略的UPDATE或INSERT子句

     

    在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中。

     

     

    2、带条件的Updates和Inserts子句

    你能够添加WHERE子句到UPDATE或INSERT子句中去, 来跳过update或insert操作对某些行的处理. 下面例子根据表NEWPRODUCTS来更新表PRODUCTS数据, 但必须字段CATEGORY也得同时匹配上

     

     

    在这个例子中, 产品ID为1502,1601和1666匹配ON条件但是1666的category不匹配. 因此MERGE命令只更新两行数据. 下面例子展示了在Updates和Inserts子句都使用WHERE子句

     

     

    注意由于有WHERE子句INSERT没有插入所有不匹配ON条件的行到表PRODUCTS.

     

    3、无条件的Inserts

    你能够不用连接源表和目标表就把源表的数据插入到目标表中. 这对于你想插入所有行到目标表时是非常有用的. Oracle 10g现在支持在ON条件中使用常量过滤谓词. 举个常量过滤谓词例子ON (1=0). 下面例子从源表插入行到表PRODUCTS, 不检查这些行是否在表PRODUCTS中存在

     

     

    4、新增加的DELETE子句

    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中的值

     

    展开全文
  • 当需要对一个表根据不同条件分别进行INSERT、UPDATE以及DELETE操作时,可以使用MERGE(融合,合并)语句。MERGE语句可以根据不同条件获取要插入、更新或删除到表中的数据行,然后从1个或多个数据源头对表进行更新或者...

    一、使用背景 

        当需要对一个表根据不同条件分别进行INSERT、UPDATE以及DELETE操作时,可以使用MERGE(融合,合并)语句。MERGE语句可以根据不同条件获取要插入、更新或删除到表中的数据行,然后从1个或多个数据源头对表进行更新或者向表中插入行。(我需要将一张表的数据更新到另一张表中)

    二、MERGE语句的语法

    
    MERGE INTO 表名
    USING 表名/视图/子查询 ON 连接条件
    -- 当匹配得上连接条件时
    WHEN MATCHED THEN 
    更新、删除操作
    -- 当匹配不上连接条件时
    WHEN NOT MATCHED THEN 
    更新、删除、插入操作

    使用条件:

    USING:简化的连接查询

    使用条件:1、查询条件必须是等值连接

                     2、等值连接列必须有相同的名称和数据类型

    三、示例

    1、创建要操作的表,并插入几条数据

    -- 60号部门员工奖金表
    CREATE TABLE dept60_bonuses
    (
       employee_id NUMBER,
       bonus_amt NUMBER
    );
     
    INSERT INTO dept60_bonuses
    VALUES
    (103, 0);
    INSERT INTO dept60_bonuses
    VALUES
    (104, 100);
    INSERT INTO dept60_bonuses
    VALUES
    (105, 0);
     
    -- 提交事务
    COMMIT;
     
    SELECT employee_id, last_name, salary
    FROM hr.employees
    

    2、根据不同条件对dept60_bonuses记录进行新增、修改以及删除操作(操作示意图)

    MERGE INTO dept60_bonuses b
    USING (
               SELECT employee_id, salary, department_id
               FROM hr.employees
               WHERE department_id = 60
          ) e
    ON (b.employee_id = e.employee_id)
    -- 当符合关联条件时
    WHEN MATCHED THEN
         -- 将奖金为0的员工的奖金调整为其工资的20%
         UPDATE 
         SET b.bonus_amt = e.salary * 0.2
         WHERE b.bonus_amt = 0
         -- 删除工资大于7500的员工奖金记录
         DELETE 
         WHERE (e.salary > 7500)
    -- 当不符合连接条件时
    WHEN NOT MATCHED THEN
         -- 将不在部门为60号的,且不在dept60_bonuses表的用工信息插入,并将其奖金设置为其工资的10%
         INSERT 
         (b.employee_id, b.bonus_amt)
         VALUES 
         (e.employee_id, e.salary * 0.1)
         WHERE (e.salary < 7500)

    3、操作结果

    4、MERGE语句完成了以下任务:

    · 更新了一行(员工id=105)

    · 删除了一行(员工id=103)

    · 插入了两行(员工id=106 & 107)
    ————————————————
    版权声明:本文为CSDN博主「周末未至」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/zorro_jin/article/details/81053693

    展开全文
  • oracle merge into 用法详解

    千次阅读 2018-08-03 14:13:02
    Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表. Oracle 10g中MERGE有如下一些改进:   1、...
  • oracle-merge用法详解

    千次阅读 2009-09-24 15:15:00
    oracle-merge用法详解 Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中
  • Oraclemerge函数用法

    千次阅读 2019-05-08 21:39:16
    写两个sql,一个insert一个update,那么其实oracle中存在merge函数,可以一次性解决这个问题,具体示例如下。 创建一张案例表如下: 下面我们向数据库插入一条数据如果ID和name相同就更新AGE的数据,否则就插入 ...
  • 主要给大家介绍了关于Oracle merge合并更新函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • SQL中Merge用法详解

    2020-12-15 08:38:53
    MERGEOracle9i新增的语法,用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表(原数据表,source table)或子查询的连接条件对另外一张(目标表,target table)表进行查询,连接条件匹配上的进行UPDATE,...
  • oraclemerge into用法解析

    万次阅读 多人点赞 2017-04-11 10:59:27
    merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...) WHEN MATCHED THEN [UPDATE sql] WHEN NOT MATCHED THEN [INSERT sql]作用:判断B表和...
  • oracle数据匹配merge into的实例详解 前言:  很久之前,估计在2010年左右在使用Oralce,当时有个需求就是需要对两个表的数据进行匹配,这两个表的数据结构一致,一个是正式表,一个是临时表,这两表数据量还算是...
  • 当我们需要合并A表和B表的数据(通过关联字段连接),但目前A表中的数据已经存在,我们需要用B表的数据,去更新A表部分字段的数据,就不能使用Insert插入了,需要更新,这时候推荐用merge into语句。
  • oracle-merge用法详解

    2010-05-20 18:38:00
    Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进: 1、UPDATE...
  • merge用法详解

    2013-05-27 16:21:57
    无论你在使用任何DBMS,你总是难以避免的将会遇到上面提到的这种需求,如果你不使用merge语句,你将会不得不在程序中增加大段的代码,或者是在oracle用很长的代码来实现。好在现在我们有了merge,可以帮我们省下很多...
  • /*Merge into 介绍 ...MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句。 通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询, 连接条件匹配上的进行UPDATE,无法匹配的执行INSER
  • Oracle merge into 的用法详解【整理】

    千次阅读 2017-06-06 13:00:48
    在进行SQL语句编写时,我们经常会遇到大量的同时进行Insert/Update的语句 , 也就是说当存在记录时...MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your query-
  • 轉:Oracle-Merge用法详解

    2009-12-10 14:40:00
    Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进: 1、UPDATE...
  • oraclemerge into语句详解

    万次阅读 多人点赞 2017-04-26 10:05:49
    merge into 语句是insert 与update语句的结合,可以同时实现update和insert的功能。 一、merge into语句的语法。 MERGE INTO schema. table alias USING { schema. table | views | query} alias ON {(condition...
  • ORACLE-MERGE用法详解

    2009-03-26 18:27:00
    Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle 10g中MERGE有如下一些改进:1、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,796
精华内容 1,518
关键字:

oraclemerge用法详解