`

db2 merge

    博客分类:
  • db2
阅读更多
DB2 MERGE INTO 语句的使用

DB2中的Merge语句可以将一个表中的数据合并到另一个表中,在合并的同时可以进行插入、删除、更新等操作,功能非常强大。

AD:

DB2Merge语句是经常可以用到的DB2语句,下面对DB2 Merge语句作了详细的介绍,如果您对此方面感兴趣的话,不妨一看。

DB2 Merge语句的作用非常强大,它可以将一个表中的数据合并到另一个表中,在合并的同时可以进行插入、删除、更新等操作。我们还是先来看个简单的例子吧,假设你定义了一个雇员表(employe),一个经理表(manager),如下所示:

---雇员表(EMPLOYE)  
CREATE TABLE EMPLOYE (  
EMPLOYEID INTEGER NOT NULL,---员工号  
NAME VARCHAR(20) NOT NULL,---姓名  
SALARY DOUBLE---薪水  
);  
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES   
(1,'张三',1000),  
(2,'李四',2000),  
(3,'王五',3000),  
(4,'赵六',4000),  
(5,'高七',5000);  
--经理表(MANAGER)  
CREATE TABLE MANAGER (  
EMPLOYEID INTEGER NOT NULL,---经理号  
NAME VARCHAR(20) NOT NULL,---姓名  
SALARY DOUBLE---薪水  
);  
INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES   
(3,'王五',5000),  
(4,'赵六',6000);

经过一段时间,你发现这样的数据模型,或者说表结构设计简直就是一大败笔,经理和雇员都是员工嘛,为什么要设计两个表呢?发现错误后就需要改正,所以你决定,删除经理表(MANAGER)表,将MANAGER 表中的数据合并到EMPLOYE  表中,仔细分析发现,王五在两个表中都存在(可能是干的好升官了),而刘八在EMPLOYE 表中并不存在,现在,我们要求把EMPLOYE  表中不存在的MANAGER都插入到EMPLOYE 表中,存在的更新薪水。该怎么办呢?这个问题并不难,通常,我们可以分两步,如下所示:

--更新存在的  
UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID)  
WHERE EMPLOYEID IN (  
SELECT MANAGERID FROM MANAGER  
);  
---插入不存在的  
INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY)  
SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN (  
SELECT EMPLOYEID FROM EMPLOYE  
);

上面的处理是可以的,但是我们还可以有更简单的方法,就是用Merge语句,如下所示:
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EM.EMPLOYEID=MA.MANAGERID
WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);


在上面的处理中,我们用经理表(MANAGER)的薪水更新了雇员表(EMPLOYE)的薪水,假设现在要求,如果经理表(MANAGER)的薪水>雇员表(EMPLOYE)的薪水的时候更新,否则不更新,怎么办呢?如下:
	
MERGE INTO EMPLOYE AS EM  
USING MANAGER AS MA  
ON EM.EMPLOYEID=MA.MANAGERID  
WHEN MATCHED AND EM.SALARY<MA.SALARY THEN UPDATE SET EM.SALARY=MA.SALARY  
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);


不仔细的朋友可能没有看出上面两条语句的区别,哈哈,请仔细对比一下这两条语句。上面的语句中多了ANDEM.SALARY<MA.SALARY语句。如果你认为理论上应该不存在EM.SALARY>MA.SALARY的数据,如果有,说明有问题,你想抛个异常,怎么办?如下:
MERGE INTO EMPLOYE AS EM  
USING MANAGER AS MA  
ON EM.EMPLOYEID=MA.MANAGERID  
WHEN MATCHED AND EM.SALARY<MA.SALARY THEN UPDATE SET EM.SALARY=MA.SALARY  
WHEN MATCHED AND EM.SALARY>MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY>MA.SALARY'
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)  
ELSE IGNORE;


对于EM.SALARY>MA.SALARY的情况,如果你不想抛异常,而是删除EMPLOYE中的数据,怎么办?如下:
MERGE INTO EMPLOYE AS EM  
USING MANAGER AS MA  
ON EM.EMPLOYEID=MA.MANAGERID  
WHEN MATCHED AND EM.SALARY<MA.SALARY THEN UPDATE SET EM.SALARY=MA.SALARY  
WHEN MATCHED AND EM.SALARY>MA.SALARY THEN DELETE 
WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY)  
ELSE IGNORE;


以上简单介绍了Merge语句的使用,它的应用不只是上面介绍的情况,其实它可以应用在很多其他语句不好处理情况,这需要你去发现,记住熟能生巧
分享到:
评论

相关推荐

    DB2 merge语句使用教程

    DB2 Merge 语句是数据库管理系统 DB2 中用于合并数据的一种高级操作,它结合了插入、更新和删除的功能,能够高效地处理多个数据源之间的数据同步。本教程将详细介绍 DB2 Merge 语句的使用方法。 首先,让我们通过一...

    DB2 MERGE INTO语句的使用

    DB2中的Merge语句可以将一个表中的数据合并到另一个表中,在合并的同时可以根据条件进行插入、删除、更新等操作,功能非常强大。

    使用BULK COLLECT, MERGE 语句提高sql执行效率

    详细介绍了使用 BULK COLLECT 进行批量操作 提高sql的执行效率 使用MERGE INTO USING 一条sql搞定 新增和修改 使用connect by 进行递归树查询

    使用IBMDB2MergeBackup简化备份和恢复

    为您提供了备用战略来消除执行定期DB2完全备份的需要,并使用多个delta备份和增量备份来构建一个能被DB2完全识别的新的完全备份副本。这篇文章介绍了IBMDB2MergeBackup,指导您使用IBMDB2MergeBackup中的控制文件...

    DB2中使用工具方便调试

    `diff.bat`和`diff.exe`可能是用于文件或数据库结构比较的工具,比如Beyond Compare或WinMerge。在DB2环境中,这类工具可以用于比较不同时间段的数据库快照,或者比较不同环境下的数据库配置,找出可能的问题源。 ...

    DB2 9 for z/OS

    - **MERGE和SELECT FROM MERGE**:这些新的SQL语句支持合并数据行或从合并操作中选择数据,为用户提供了一种高效的方式来更新或插入数据。 - **SELECT FROM UPDATE或DELETE**:允许用户在执行UPDATE或DELETE操作的...

    db2问题总结.sql

    db2使用过程中基本问题的解决方案,包含了截串、时间、merge into的基本用法、存储过程、case when的基础用法

    db2 SQL优化

    DB2提供了多种连接方法,包括嵌套循环连接(nested loop join)、合并连接(merge join)以及散列连接(hash join)。每种方法都有其适用场景和限制条件。 - **嵌套循环连接**:这是一种简单但效率较低的连接方式。它通过...

    DB2嵌套循环

    在数据库管理领域,DB2是一个广泛使用的高性能关系型数据库系统,...在实际工作中,需要根据业务需求和数据规模,灵活选择合适的连接方法,如哈希连接(Hash JOIN)或归并连接(Merge JOIN),以实现更高效的查询处理。

    DB2 SQL 精萃.pdf

    11. 使用MERGE语句进行数据操作。 12. 采集样本数据的技术。 13. 如何使用DISTINCT去除结果集中的重复行。 14. SQL语句中OR的使用,以及如何避免。 15. WHERE子句中函数的使用限制。 16. SQL语句中LIKE的使用注意...

    DB2 V9 sql Reference

    - **MERGE**:将多条SQL语句合并成一条。 #### 3. 数据控制语言 (DCL) - **GRANT**:授予用户对数据库对象的操作权限。 - **REVOKE**:收回已授予的权限。 - **COMMIT**:提交事务。 - **ROLLBACK**:回滚事务。 #...

    db2性能调优10条

    优化排序和合并操作 (Sort and Merge Optimization) 在执行大量数据排序和合并操作的应用程序中,如果使用的排序堆(SORTHEAP)太小,会导致额外的磁盘I/O操作,进而影响性能。可以通过以下命令获取排序相关的统计...

    DB2 SQL 消息

    - **SQL0150N:** 表示`INSERT`、`DELETE`、`UPDATE`、`MERGE`等语句中缺少`FROM`子句。 - **SQL0151N:** 表示未知错误。 每一条SQL消息都提供了对特定问题的深入理解和解决思路。对于DB2数据库的开发者和管理员来说...

    使用DB2look重新创建优化器访问计划(4)

    例如,DFT_QUERYOPT参数值的改变可能导致不同的查询优化策略,如在本例中从Hash Join变为Merge Join。 要确保测试环境的访问计划与生产环境一致,你需要比较两者之间的配置差异。在本例中,DFT_QUERYOPT被更新为5,...

    DB2常见SQL问题解释

    例如,SQL0150N指出在执行INSERT、DELETE、UPDATE或MERGE操作时,可能因目标表的主键约束而失败。 ### 3. 解决策略 面对DB2中出现的SQL问题,关键在于理解错误代码的具体含义,并根据上下文环境分析可能的成因。...

    DB2存储过程

    ### DB2存储过程知识点 #### 一、DB2存储过程编写规范概述 DB2存储过程是一种在数据库中预编译并存储的过程,它可以接受输入参数、返回单个或多个结果集,以及返回状态值。编写良好的DB2存储过程能够提高数据库...

    7表类型(存储引擎)的选择

    - **操作影响:**对MERGE表的`DROP`操作仅删除MERGE定义,不影响内部的MyISAM表。 #### 总结 - **MyISAM:**适用于读取密集型应用,不支持事务处理。 - **InnoDB:**支持事务处理,提供外键约束和行级锁定机制,...

    dbs.rar_oracle

    这涉及到索引的使用、表扫描方式(全表扫描或索引扫描)、连接操作(Nested Loop, Merge Join, Hash Join)的选择等。优化执行计划可以显著提升查询性能,减少资源消耗。文本文件“informix调优之执行计划.txt”可能...

Global site tag (gtag.js) - Google Analytics