
DB2 Merge语句是经常可以用到的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);—雇员表(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);–更新存在的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 EMUSING MANAGER AS MAON EM.EMPLOYEID=MA.MANAGERIDWHEN MATCHED theN UPDATE SET EM.SALARY=MA.SALARYWHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);MERGE INTO EMPLOYE AS EMUSING MANAGER AS MAON EM.EMPLOYEID=MA.MANAGERIDWHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARYWHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);
在上面的处理中,我们用经理表(MANAGER)的薪水更新了雇员表(EMPLOYE)的薪水,假设现在要求,如果经理表(MANAGER)的薪水>雇员表(EMPLOYE)的薪水的时候更新,否则不更新,怎么办呢?如下:
MERGE INTO EMPLOYE AS EMUSING MANAGER AS MAON EM.EMPLOYEID=MA.MANAGERIDWHEN MATCHED AND EM.SALARY
不仔细的朋友可能没有看出上面两条语句的区别,哈哈,请仔细对比一下这两条语句。上面的语句中多了ELSE IGNORE语句,它的意思正如它英文的意思,其它情况忽略不处理。如果你认为理论上应该不存在EM.SALARY>MA.SALARY的数据,如果有,说明有问题,你想抛个异常,怎么办?如下:
MERGE INTO EMPLOYE AS EMUSING MANAGER AS MAON EM.EMPLOYEID=MA.MANAGERIDWHEN MATCHED AND EM.SALARY
对于EM.SALARY>MA.SALARY的情况,如果你不想抛异常,而是删除EMPLOYE中的数据,怎么办?如下:
MERGE INTO EMPLOYE AS EMUSING MANAGER AS MAON EM.EMPLOYEID=MA.MANAGERIDWHEN MATCHED AND EM.SALARY
以上简单介绍了Merge语句的使用,它的应用不只是上面介绍的情况,其实它可以应用在很多其他语句不好处理情况,这需要你去发现,记住熟能生巧
【编辑推荐】
DB2游标原理介绍
db2日志保存的两种方式
几种常用的DB2循环用法
四种常用的DB2循环语句
DB2创建数据库的实现
SQLServer2008:划于2008年第一季度发布的SQL Server 2008不仅对原有性能进行了改进,还添加了许多新特性,比如新添了数据集成功能,改进了分析服务,报告服务,以及Office集成等等。
SQL Server集成服务SSIS(SQL Server集成服务)是一个嵌入式应用程序,用于开发和执行ETL(解压缩、转换和加载)包。
SSIS代替了SQL 2000的DTS。
整合服务功能既包含了实现简单的导入导出包所必需的Wizard导向插件、工具以及任务,也有非常复杂的数据清理功能。
SQL Server 2008 SSIS的功能有很大的改进和增强,比如它的执行程序能够更好地并行执行。
在SSIS 2005,数据管道不能跨越两个处理器。
而SSIS 2008能够在多处理器机器上跨越两个处理器。
而且它在处理大件包上面的性能得到了提高。
SSIS引擎更加稳定,锁死率更低。
Lookup功能也得到了改进。
Lookup是SSIS一个常用的获取相关信息的功能。
比如从CustomerID查找Customer Name,获取数据集。
Lookup在SSIS中很常见,而且可以处理上百万行的数据集,因此性能可能很差。
SQL 2008对Lookup的性能作出很大的改进,而且能够处理不同的数据源,包括 ,XML,OLEDB和其他SSIS压缩包。
SQL 2008可以执行TSQL的MERGE命令。
用MERGE命令,只需一个语句就可以对行进行 UPDATE、INSERT或 DELETE。
下面的例子就是如何用MERGE命令来把新的Inventory Item descriptions 列表插入已有的Inventory Master中。
除了 descriptions, NewInventory表格中还加入了其他一些部分。
如果没有MERGE语句,就需要执行两个命令才能完成。
第一个命令查找匹配的 Description然后更新。
第二个命令查找不匹配项然后插入。
有了MERGE,一个语句就可以完成这两个任务。
步骤如下:MERGE InventoryMaster AS imUSING (SELECT InventoryID, Descr FROM NewInventory) AS srcON im. InventoryID = src. InventoryIDWHEN MATCHED THENUPDATE SET = NOT MATCHED THENINSERT (InventoryID, Descr) VALUES (src. InventoryID, );分析服务SSAS(SQL Server分析服务)也得到了很大的改进和增强。
IB堆叠做出了改进,性能得到很大提高,而硬件商品能够为Scale out管理工具所使用。
Block computation也增强了立体分析的性能。
报表服务SSRS(SQL Server 报表服务)的处理能力和性能得到改进,使得大型报表不再耗费所有可用内存。
另外,在报表的设计和完成之间有了更好的一致性。
SQL SSRS 2008还包含了跨越表格和矩阵的TABLIX。
Application Embedding 允许用户点击报表中的 URL链接调用应用程序。
Microsoft Office 2007SQL Server 2008能够与 Microsoft Office 2007完美地结合。
例如,SQL Server Reporting Server能够直接把报表导出成为word文档。
而且使用 Report Authoring工具,Word和Excel都可以作为SSRS报表的模板。
Excel SSAS新添了一个数据挖掘插件,提高了其性能。
Oracle9i引入了MERGE命令,你能够在一个SQL语句中对一个表同时执行inserts和updates操作. MERGE命令从一个或多个数据源中选择行来updating或inserting到一个或多个表.在Oracle10g中MERGE有如下一些改进:1、UPDATE或INSERT子句是可选的2、UPDATE和INSERT子句可以加WHERE子句3、在ON条件中使用常量过滤谓词来insert所有的行到目标表中,不需要连接源表和目标表4、UPDATE子句后面可以跟DELETE子句来去除一些不需要的行语法:MERGEHINTINTO SCHEMA T_ALIASUSINGSCHEMA . {TABLE | VIEW |SUBQUERY } T_ALIASON (CONDITION)WHENMATCHEDTHEN MERGE_UPDATE_CLAUSEWHENNOTMATCHED THEN MERGE_INSERT_CLAUSE / MERGE_DELETE_CLAUSE;
db2的merge into语句怎么改写成mysql的?本处使用 db2 –t 进入系统。
-- 源表db2 => CREATE TABLE test_from (id INT, val VARCHAR(20));DBISQL 命令成功完成。
-- 目标表db2 => CREATE TABLE test_to (id INT, val VARCHAR(20));DBISQL 命令成功完成。
-- 插入源表db2 => INSERT INTO test_from VALUES (1, A);DBISQL 命令成功完成。
db2 => INSERT INTO test_from VALUES (2, B);DBISQL 命令成功完成。
数据库SQLServer最新版本是什么?
oracle merge的使用
db2的merge into语句怎么改写成MySQL的?
发表评论