2023年8月3日发(作者:)
MERGE语句⽤来合并UPDATE和INSERT语句,⼀张表的⼤数据操作,要同时进⾏增删改。。。该命令使⽤⼀条语句从⼀个或者多个数据源中完成对表的更新和插⼊数据. ORACLE 9i 中,使⽤此命令必须同时指定UPDATE 和INSERT关键词,ORACLE 10g 做了如下改动。1,insert 和update是可选的 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 MERGE INTO products p
2 USING newproducts np
3 ON (t_id = t_id)
4 WHEN MATCHED THEN
5 UPDATE
6 SET t_name = t_name,
7 ry = ry; 使⽤表newproducts中的product_name 和category字段来更新表products 中相同product_id的product_name 和category.2,当条件不满⾜的时候把newproducts表中的数据INSERT 到表products中。MERGE INTO products p
USING newproducts np
ON (t_id = t_id)
WHEN NOT MATCHED THEN
INSERT
VALUES (t_id, t_name,
ry);
3,带条件的insert 和updateMERGE INTO products p
USING newproducts np
ON (t_id = t_id)
WHEN MATCHED THEN
UPDATE
SET t_name = t_name
WHERE ry = ry; insert 和update 都带有where 字句
MERGE INTO products p
USING newproducts np
ON (t_id = t_id)
WHEN MATCHED THEN
UPDATE
SET t_name = t_name,
ry = ry
WHERE ry = 'DVD'
WHEN NOT MATCHED THEN INSERT
VALUES (t_id, t_name, ry)
WHERE ry != 'BOOKS'
4,⽆条件的insertMERGE INTO products p
USING newproducts np
ON (1=0)
WHEN NOT MATCHED THEN
INSERT
VALUES (t_id, t_name, ry)
WHERE ry = 'BOOKS'
5,delete ⼦句1 merge into products p 2 using newproducts np 3 on(t_id = t_id) 4 when matched then 5 update 6 set t_name = t_name 7 delete where category = 'macle1_cate';select *from products; PRODUCT_ID PRODUCT_NAME CATEGORY--------------------------------------- -------------------- -------------------- 1502 macle22 macle2_cate 1503 macle3 macle2_cate 1504 macle macle1_cate 1505 macle5 macle5_cate1504 中的macle1_cate 满⾜delete where,但是不满⾜ on 中的条件,所以没有被删除。重点-----------------------------------------------动机:想在Oracle中⽤⼀条SQL语句直接进⾏Insert/Update的操作。说明:在进⾏SQL语句编写时,我们经常会遇到⼤量的同时进⾏Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插⼊(Insert)。实战:接下来我们有⼀个任务,有⼀个表T,有两个字段a,b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插⼊⼀条记录。在Microsoft的SQL语法中,很简单的⼀句判断就可以了,SQL Server中的语法如下:if exists(select 1 from T where T.a='1001' ) update T set T.b=2 Where T.a='1001' else insert into T(a,b) values('1001',2);以上语句表明当T表中如果存在a='1001' 的记录的话,就把b的值设为2,否则就Insert⼀条a='100',b=2的记录到T中。但是接下来在Oracle中就遇到⿇烦了,记得在Oracle 9i之后就有⼀条Merge into 的语句可以同时进⾏Insert 和Update的吗,Merge的语法如下: 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);
上⾯的语法⼤家应该都容易懂吧,那我们按照以上的逻辑再写⼀次。 MERGE INTO T T1USING ( SELECT a,b FROM T WHERE t.a = ' 1001 ' ) T2 ON ( T1.a = T2.a) WHEN MATCHED THEN
UPDATE SET T1.b = 22
WHEN NOT MATCHED THEN
INSERT (a,b) VALUES ( ' 1001 ' , 22 );以上的语句貌似很对是吧,实际上,该语句只能进⾏更新,⽽⽆法进⾏Insert,错误在哪⾥呢?其实在Oracle中Merge语句原先是⽤来进⾏整表的更新⽤的,也就是ETL⼯具⽐较常⽤的语法,重点是在Using上。⽤中⽂来解释Merge语法,就是:在alias2中Select出来的数据,每⼀条都跟alias1进⾏ ON (join condition)的⽐较,如果匹配,就进⾏更新的操作(Update),如果不匹配,就进⾏插⼊操作(Insert)。因此,严格意义上讲,”在⼀个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”以上这句话也就很好的解释了在上⾯写的语句为何只能进⾏Update,⽽不能进⾏Insert了,因为都Select不到数据,如何能进⾏Insert呢:)接下来要改成正确的语句就容易多了,如下: MERGE INTO T T1USING ( SELECT '1001' AS a,2 AS b FROM dual) T2 ON ( T1.a = T2.a) WHEN MATCHED THEN UPDATE SET T1.b = T2.b WHEN NOT MATCHED THEN INSERT (a,b) VALUES (T2.a,T2.b);查询结果,OK!注意:如果不懂Merge语句的原理,Merge语句是⼀条⽐较危险的语句,特别是在您只想更新⼀条记录的时候,因为不经意间,你可能就把整表的数据都Update了⼀遍.....汗我曾经犯过的⼀个错误如下所⽰,⼤家看出来是什么问题了吗? MERGE INTO T T1USING ( SELECT Count ( * ) cnt FROM T WHERE T.a = ' 1001 ' ) T2 ON ( > 00 ) WHEN MATCHED THEN
UPDATE SET T1.b = T2.b WHEN NOT MATCHED THEN
INSERT (a,b) VALUES (T2.a,T2.b);
2023年8月3日发(作者:)
MERGE语句⽤来合并UPDATE和INSERT语句,⼀张表的⼤数据操作,要同时进⾏增删改。。。该命令使⽤⼀条语句从⼀个或者多个数据源中完成对表的更新和插⼊数据. ORACLE 9i 中,使⽤此命令必须同时指定UPDATE 和INSERT关键词,ORACLE 10g 做了如下改动。1,insert 和update是可选的 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 MERGE INTO products p
2 USING newproducts np
3 ON (t_id = t_id)
4 WHEN MATCHED THEN
5 UPDATE
6 SET t_name = t_name,
7 ry = ry; 使⽤表newproducts中的product_name 和category字段来更新表products 中相同product_id的product_name 和category.2,当条件不满⾜的时候把newproducts表中的数据INSERT 到表products中。MERGE INTO products p
USING newproducts np
ON (t_id = t_id)
WHEN NOT MATCHED THEN
INSERT
VALUES (t_id, t_name,
ry);
3,带条件的insert 和updateMERGE INTO products p
USING newproducts np
ON (t_id = t_id)
WHEN MATCHED THEN
UPDATE
SET t_name = t_name
WHERE ry = ry; insert 和update 都带有where 字句
MERGE INTO products p
USING newproducts np
ON (t_id = t_id)
WHEN MATCHED THEN
UPDATE
SET t_name = t_name,
ry = ry
WHERE ry = 'DVD'
WHEN NOT MATCHED THEN INSERT
VALUES (t_id, t_name, ry)
WHERE ry != 'BOOKS'
4,⽆条件的insertMERGE INTO products p
USING newproducts np
ON (1=0)
WHEN NOT MATCHED THEN
INSERT
VALUES (t_id, t_name, ry)
WHERE ry = 'BOOKS'
5,delete ⼦句1 merge into products p 2 using newproducts np 3 on(t_id = t_id) 4 when matched then 5 update 6 set t_name = t_name 7 delete where category = 'macle1_cate';select *from products; PRODUCT_ID PRODUCT_NAME CATEGORY--------------------------------------- -------------------- -------------------- 1502 macle22 macle2_cate 1503 macle3 macle2_cate 1504 macle macle1_cate 1505 macle5 macle5_cate1504 中的macle1_cate 满⾜delete where,但是不满⾜ on 中的条件,所以没有被删除。重点-----------------------------------------------动机:想在Oracle中⽤⼀条SQL语句直接进⾏Insert/Update的操作。说明:在进⾏SQL语句编写时,我们经常会遇到⼤量的同时进⾏Insert/Update的语句 ,也就是说当存在记录时,就更新(Update),不存在数据时,就插⼊(Insert)。实战:接下来我们有⼀个任务,有⼀个表T,有两个字段a,b,我们想在表T中做Insert/Update,如果存在,则更新T中b的值,如果不存在,则插⼊⼀条记录。在Microsoft的SQL语法中,很简单的⼀句判断就可以了,SQL Server中的语法如下:if exists(select 1 from T where T.a='1001' ) update T set T.b=2 Where T.a='1001' else insert into T(a,b) values('1001',2);以上语句表明当T表中如果存在a='1001' 的记录的话,就把b的值设为2,否则就Insert⼀条a='100',b=2的记录到T中。但是接下来在Oracle中就遇到⿇烦了,记得在Oracle 9i之后就有⼀条Merge into 的语句可以同时进⾏Insert 和Update的吗,Merge的语法如下: 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);
上⾯的语法⼤家应该都容易懂吧,那我们按照以上的逻辑再写⼀次。 MERGE INTO T T1USING ( SELECT a,b FROM T WHERE t.a = ' 1001 ' ) T2 ON ( T1.a = T2.a) WHEN MATCHED THEN
UPDATE SET T1.b = 22
WHEN NOT MATCHED THEN
INSERT (a,b) VALUES ( ' 1001 ' , 22 );以上的语句貌似很对是吧,实际上,该语句只能进⾏更新,⽽⽆法进⾏Insert,错误在哪⾥呢?其实在Oracle中Merge语句原先是⽤来进⾏整表的更新⽤的,也就是ETL⼯具⽐较常⽤的语法,重点是在Using上。⽤中⽂来解释Merge语法,就是:在alias2中Select出来的数据,每⼀条都跟alias1进⾏ ON (join condition)的⽐较,如果匹配,就进⾏更新的操作(Update),如果不匹配,就进⾏插⼊操作(Insert)。因此,严格意义上讲,”在⼀个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数。”以上这句话也就很好的解释了在上⾯写的语句为何只能进⾏Update,⽽不能进⾏Insert了,因为都Select不到数据,如何能进⾏Insert呢:)接下来要改成正确的语句就容易多了,如下: MERGE INTO T T1USING ( SELECT '1001' AS a,2 AS b FROM dual) T2 ON ( T1.a = T2.a) WHEN MATCHED THEN UPDATE SET T1.b = T2.b WHEN NOT MATCHED THEN INSERT (a,b) VALUES (T2.a,T2.b);查询结果,OK!注意:如果不懂Merge语句的原理,Merge语句是⼀条⽐较危险的语句,特别是在您只想更新⼀条记录的时候,因为不经意间,你可能就把整表的数据都Update了⼀遍.....汗我曾经犯过的⼀个错误如下所⽰,⼤家看出来是什么问题了吗? MERGE INTO T T1USING ( SELECT Count ( * ) cnt FROM T WHERE T.a = ' 1001 ' ) T2 ON ( > 00 ) WHEN MATCHED THEN
UPDATE SET T1.b = T2.b WHEN NOT MATCHED THEN
INSERT (a,b) VALUES (T2.a,T2.b);
发布评论