2023年12月14日发(作者:杀病毒)
db2mergeinto语法
MERGE INTO table_name alias1
USING (table|view|sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name SET col1 = col_val1,col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values)
关键字、参数
into子句
在into子句中指定所要修改或者插入数据的目标表
using子句
在using子句中指定用来修改或者插入的数据源。数据源可以是表、视图或者一个子查询语句。
on子句
在on子句中指定执行插入或者修改的满足条件。
when matched | not matched
用该子句通知 如何对满足或不满足条件的结果做出相应的操作。可以使用以下的两类子句。
merge_update子句
merge_update子句执行对目标表中的字段值修改。当在符合on子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。
merge_update子句
merge_update子句执行对目标表中的字段值修改。当在符合on子句条件的情况下执行。如果修改子句执行,则目标表上的修改触发器将被触发。
限制:当修改一个视图时,不能指定一个default值
merge_inrt 子句
merge_inrt子句执行当不符合on子句条件时,往目标表中插入数据。如果插入子句执行,则目标表上插入触发器将被触发。
限制:当修改一个视图时,不能指定一个default值
MERGE INTO BONUSES D
USING (SELECT EMPLOYEE_ID, SALARY, DEPARTMENT_ID FROM EMPLOYEES WHERE DEPARTMENT_ID = 80) S
ON (EE_ID = EE_ID)
WHEN MATCHED THEN UPDATE SET = + *.01
WHEN NOT MATCHED THEN INSERT (EE_ID, ) VALUES (EE_ID, *0.01);
MERGE INTO XCMDTRANSFERSTATE AS T
USING TABLE (VALUES(?,?,?,?,?,?)) T1(DATASNO,EXTERIORSYSTEM,STATUS,DATA_TIME,MARKFORDELETE,DATATRANSFERNO)
ON (ANSFERNO = ANSFERNO)
WHEN MATCHED THEN update t O = O,ORSYSTEM = ORSYSTEM, =
,_TIME = _TIME,RDELETE = RDELETE
WHEN NOT MATCHED THEN INSERT (DATASNO,EXTERIORSYSTEM,STATUS,CREATE_TIME,MARKFORDELETE,DATATRANSFERNO) VALUES
(O,ORSYSTEM,,_TIME,RDELETE,ANSFERNO
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN MATCHED AND > THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = '>'
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
ELSE IGNORE;
-----
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=EID)
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 EID=RID
WHEN MATCHED THEN UPDATE SET =
WHEN NOT MATCHED THEN INSERT VALUES (RID,,);
在上面的处理中,我们用经理表(MANAGER)的薪水更新了雇员表(EMPLOYE)的薪水,假设现在要求,如果经理表(MANAGER)的
薪水>雇员表(EMPLOYE)的薪水的时候更新,否则不更新,怎么办呢?如下:
-1
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN NOT MATCHED THEN INSERT VALUES (RID,,);
-2
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
el ignore
不仔细的朋友可能没有看出上面两条语句的区别,哈哈,请仔细对比一下这两条语句。上面的语句中多了ELSE IGNORE语句,它的意思正
如它英文的意思,其它情况忽略不处理。
如果你认为理论上应该不存在>的数据,如果有,说明有问题,你想抛个异常,怎么办?如下:
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN MATCHED AND > THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT =
'>'
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
ELSE IGNORE;
对于>的情况,如果你不想抛异常,而是删除EMPLOYE中的数据,怎么办?如下:
MERGE INTO EMPLOYE AS EM
USING MANAGER AS MA
ON EID=RID
WHEN MATCHED AND < THEN UPDATE SET =
WHEN MATCHED AND > THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (RID,,)
ELSE IGNORE;
本文发布于:2023-12-14 05:10:28,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/1702501829245876.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:db2mergeinto语法.doc
本文 PDF 下载地址:db2mergeinto语法.pdf
留言与评论(共有 0 条评论) |