merge语法,使用分析函数自连接

最近生产上要做一个批量数据的插入sql,但是查询条件很复杂,就研究了下merge语句。
merge 语法:
merge into A
using(多表联合查询语句) B
on(A.某个字段 = B.某个字段 and…)
when matched then
更新语句:update set…,注意这里只能是更新语句
when not matched then
插入语句:insert (column_lists) values(B.c1, B.c2,B.c3….),注意这里只能是插入语句,column_lists可以省略,但是最好不要省略,因为一般测试数据库和生产数据库字段顺序不一样,省略了就对不上号了。

A表就是要被更新或插入的表,B就是下面更新或插入所需的数据的查询汇总。
on条件这里,如果我们只是将B的数据插入到A表,而A表此时是没有和B关联的数据的,这里可以用1!=1这样写,双重否定就是肯定。。

using里面的查询如果用到了自连接,比如查找最大最小的记录,可以用下面这个语句,效率比简单的写两个嵌套的select高很多:
with C_tmp as (select max(c.colnum1) over (partition by colnum2) max_colnum1 from C c where c.colnum3=…)
select * from C_tmp ct where ct.colnum1 = ct.max_colnum1
这个语句主要是普通写法就是这样的:
select c.* from C c where c.colnum1 = (select max(ct.colnum1) from C ct where c.colnum2 = ct.colnum2)
当然如果你确定的知道colnum1 等于多少的时候那就当我没说,如果这个是淘宝的订单表,当你需要每个淘宝客户的最早一笔订单时,colnum2 就是客户编号。

如果要根据某个字段的值不同,更新或插入的值也不同,可以用
case B.column3 when 1 then 100
when 2 then 200

else
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值