`
guochongcan
  • 浏览: 328732 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

MERGE

 
阅读更多

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

分享到:
评论

相关推荐

    Araxis Merge v6.5/Araxis Merge 2017比对工具

    Araxis Merge是一款比对软件工具,不仅支持单个文件的比对,而且支持对两个文件夹的所有文件进行对比,并实时修改。用了蛮久感觉很好用,所以分享给大家。 里面给大家内嵌了Araxis Merge v6.5和Araxis Merge 2017两...

    MergeList_Sq.zip_MergeList Sq_MergeList_Sq

    标题“MergeList_Sq.zip_MergeList Sq_MergeList_Sq”暗示了我们正在处理一个与线性表合并相关的项目,可能是一个程序或代码库,其中包含了名为“MergeList_Sq”的压缩文件,该文件包含了一个名为“MergeList_Sq.cpp...

    winmerge代码比较工具

    **WinMerge:强大的代码比较与合并工具** WinMerge是一款高效且易用的代码比较工具,类似于知名的Beyond Compare,但它提供了一种免注册码的使用体验,对于开发者和日常文件管理用户来说,它是一个非常实用的选择。...

    开源软件 winmerge 代码

    【开源软件 WinMerge 代码详解】 WinMerge 是一个在开源社区广受欢迎的文件对比与合并工具,主要用于文本文件、源代码文件甚至整个目录结构的差异分析。它的主要功能包括两个或更多文件的逐行比较、合并冲突以及...

    WinMerge WinMerge WinMerge

    WinMerge是一款强大的文本和文件比较工具,尤其在IT行业中,它是开发者和版本控制使用者的得力助手。这个软件能够帮助用户高效地对比不同版本的代码或者其他文本文件,从而快速定位和理解版本之间的差异。 首先,...

    WinMerge.zip

    WinMerge是一款强大的文本比较工具,尤其在IT行业中,它被广泛用于代码的差异对比和版本控制。这款软件能够帮助开发者迅速地找出两个文件或者目录之间的差异,并提供方便的合并功能,极大地提升了工作效率。 标题...

    Araxis Merge v6.5(含破解补丁)

    Araxis Merge是一款在Windows操作系统中广泛使用的专业级文件比较与合并工具,尤其受到程序员和IT专业人士的青睐。这款软件能够帮助用户快速识别并解决代码冲突,对比文本文件、目录和版本控制系统中的差异,极大地...

    WinMerge文件比较工具

    WinMerge是一款功能强大的文件和目录比较工具,尤其在IT领域中,它被广泛用于代码版本控制、合并代码差异以及同步不同计算机之间的文件。WinMerge以其直观的用户界面和高效的对比功能,使得文件比较和合并变得轻松...

    AraxisMerge绿色版

    Araxis Merge是一款备受推崇的文件比较工具,尤其在IT专业人士中广受欢迎。它以其强大的功能、易用性和高效性著称,被誉为最好用的比较工具。这个“AraxisMerge绿色版”是免安装版本,无需复杂的安装过程,用户可以...

    Araxis_Merge 6.0

    在当今软件开发和文档管理的环境中,Araxis Merge 6.0已成为IT专业人士不可或缺的工具之一。它不仅具备强大的文件比较与合并功能,还通过其直观的可视化界面,大大提升了工作效率。本文将深入探讨Araxis Merge 6.0的...

    Image-merge.rar_Image.merge_image merge应用_merge image

    本文将深入探讨“Image Merge”这一主题,它涉及到如何将两幅图像合并成一幅新的图像。我们将主要关注`image.merge`功能以及其在实际应用中的使用。 在OpenCV库中,`merge`函数是一个关键的图像处理操作,它允许...

    two-phase-merge_sort-.rar_2phase merge sort_merge_sort_two merge

    标题中的"two-phase-merge_sort-.rar_2phase merge sort_merge_sort_two merge"指的是一个采用两阶段归并排序算法的程序或文档集合。这个算法是针对大数据量、无法一次性加载到内存中的情况设计的,常见于外部排序...

    WinMerge(java代码比较工具)

    WinMerge是一款功能强大的文本和文件比较工具,尤其在Java开发领域中被广泛使用。它能够帮助开发者们快速、准确地找出两个代码文件之间的差异,从而提高工作效率,减少因人为疏忽导致的错误。这款工具支持多种文件...

    WinMerge(文件比较)

    **WinMerge:强大的文件比较与合并工具** WinMerge是一款高效且易于使用的文件比较软件,尤其在IT领域中,它被广泛用于代码版本控制、文档差异分析等场景。该软件能够帮助用户快速识别并解决文件之间的差异,从而...

    WinMerge(文件比较器)

    **WinMerge:强大的文件与目录比较工具** WinMerge是一款高效且易用的文件比较软件,尤其在编程和版本控制领域中被广泛使用。它能够帮助用户进行行级的文本文件对比,找出两个文件或目录之间的差异,从而快速定位并...

    Merge工具 win Merge

    **Win Merge:一款强大的文件与文件夹比较工具** 在IT领域,经常需要处理不同版本的文件或代码,这时,一个高效的文件比较工具就显得尤为重要。Win Merge是一款深受开发者和普通用户喜爱的免费文件和文件夹比较工具...

    winmerge文件比较工具

    《WinMerge文件比较工具详解》 在日常的软件开发、文档编辑或版本控制工作中,我们经常需要比较两个文件或文件夹的差异,以便找出不同之处并进行修改。这时,WinMerge就成为了一款非常实用的文件比较工具。本文将...

    文件比较工具WinMerge

    **WinMerge:强大的文件比较与合并工具** WinMerge是一款在IT行业中广泛应用的文件比较工具,尤其对于软件开发者和版本控制使用者来说,它是一款不可或缺的辅助软件。标题中的"WinMerge"正是这款工具的名字,它的...

    WinMerge工具免安装版-开源免费.7z

    **WinMerge工具详解** WinMerge是一款非常实用的开源文件比较工具,特别适合于开发者和日常用户进行文件或代码的差异对比。它具有直观的界面,支持Windows操作系统,并且提供了免安装版本,方便用户直接下载使用,...

    Simpo PDF Merge and Split

    《Simpo PDF Merge and Split:一体化的PDF处理工具》 Simpo PDF Merge and Split是一款专为用户设计的高效、易用的PDF管理软件,它集成了PDF文件的合并与分割功能,极大地提升了用户在处理PDF文档时的工作效率。...

Global site tag (gtag.js) - Google Analytics