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

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); 


不仔细的朋友可能没有看出上面两条语句的区别,哈哈,请仔细对比一下这两条语句。上面的语句中多了ELSE IGNORE语句,它的意思正如它英文的意思,其它情况忽略不处理。如果你认为理论上应该不存在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语句的使用,它的应用不只是上面介绍的情况,其实它可以应用在很多其他语句不好处理情况,这需要你去发现,记住熟能生巧。

转自:http://blog.csdn.net/shangboerds/article/details/4775422
分享到:
评论

相关推荐

    DB2 merge语句使用教程

    本教程将详细介绍 DB2 Merge 语句的使用方法。 首先,让我们通过一个简单的例子来理解 DB2 Merge 语句的工作原理。假设我们有两个表,一个是雇员表(EMPLOYE),另一个是经理表(MANAGER)。这两个表都有员工号...

    解析SQL Server 2008中的新语句:MERGE

    根据一个源数据表对另一个数据表进行确定性的插入、更新和删除这样复杂的操作,运用新的MERGE语句,开发者用一条命令就可以完成。对两个表进行信息同步时,有三步操作要进行。首先要处理任何需要插入目标数据表的新...

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

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

    DB2 MERGE INTO语句的使用

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

    触发器Merge语句执行.txt

    可通过merge语句功能,进行数据同步存储功能,里面有具体事例可供参考。大大减少了开发时间,提高了工作执行效率。

    Mybatis批量foreach merge into的用法

    首先,需要使用Oracle 9i及其以后版本支持的merge into语句,该语句可以实现insertOrUpdate的功能。然后,使用Mybatis的动态SQL语法foreach循环插入,待插入的实体bean的List通过查询数据库dual形成表。foreach的 ...

    Merge Into 语句代替InsertUpdate

    非常经典的SQL经验,适合于数据库初学者及长期从事软件开发者

    MySQL中实现插入或更新操作(类似Oracle的merge语句)

    然而,MySQL并不直接支持`MERGE`语句,但我们可以使用`INSERT ... ON DUPLICATE KEY UPDATE`语法来达到类似的效果。 `INSERT ... ON DUPLICATE KEY UPDATE`是MySQL提供的一种实用功能,它结合了`INSERT`和`UPDATE`...

    generate-sql-merge:生成带有表数据SQL MERGE语句

    生成带有表数据SQL MERGE语句 该系统存储过程将表名作为参数,并生成包含所有表数据的MERGE语句。 如果您需要,例如,这很有用。 生成的MERGE语句可以包含在源代码管理中,并用于在DEV / TEST / PROD之间部署数据。...

    Oracle_merge

    ### Oracle Merge 语句详解 #### 一、引言 在数据库管理中,尤其是在处理大量数据的场景下,高效地更新或插入数据是一项至关...掌握好 `MERGE` 语句的使用方法,对于从事数据库管理和应用开发的专业人士来说至关重要。

    Merge-Sql.zip

    本文将深入探讨MERGE语句的使用,以及在不支持MERGE的数据库环境中可能采取的替代策略。 首先,让我们理解什么是MERGE语句。在SQL标准中,MERGE是一种DML(数据操纵语言)操作,它结合了INSERT、UPDATE和DELETE的...

    SQL Server使用Merge语句当源表数据集为空时,无法进行查询的问题

    在SQL Server中,`MERGE`语句是一种强大的工具,用于合并两个数据集,它可以实现插入、更新或删除操作。然而,当源表数据集为空时,`MERGE`语句可能不会按照预期的方式工作。这个问题在【标题】和【描述】中已经提到...

    oracle Merge 函数.doc

    Oracle Merge 函数是一种强大的数据操作语句,用于从一个表中选择一些数据更新或者插入到另一个表中。Merge 函数的使用方式有三种:只更新不插入、只插入不更新和既插入也更新。 Merge 函数的基本用法 Merge ...

    merge用法详解(实例详解)

    【知识点详解】 ...通过以上介绍,我们了解了`MERGE INTO`语句的基本概念和使用方法,以及在实际场景中如何进行数据同步。在数据库管理和ETL过程中,合理运用`MERGE`能有效地提高数据处理的效率和准确性。

    oracle merge into的使用

    标题:Oracle Merge Into 的使用 描述详解:Oracle Merge Into 是一个功能强大的SQL语句,它在Oracle数据库系统中被广泛用于处理数据同步、更新或插入操作。与传统的UPDATE和INSERT语句相比,Merge Into 提供了更为...

    Oracle中merge into的使用

    在Oracle数据库中,`MERGE INTO`语句是一种强大的数据操作工具,它允许你在一个步骤中执行更新(UPDATE)和插入(INSERT)操作,从而提高了数据处理的效率和灵活性。这个命令尤其适用于需要同步两个表的数据时,比如...

    Merge into的使用详解

    在SQL语言中,`MERGE INTO`语句是一种强大的工具,用于合并两个数据集,它允许根据特定条件将数据从一个源(通常是临时表或视图)插入或更新到目标表。这个操作通常被称为“合并”或“ Upsert”,因为它可以实现插入...

Global site tag (gtag.js) - Google Analytics