问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql merge和join的区别

发布网友 发布时间:2022-04-09 05:25

我来回答

2个回答

懂视网 时间:2022-04-09 09:46

代码如下:
if OBJECT_ID(‘Demo_AllProducts‘) is not null 
drop table Demo_AllProducts 
go 
Create table Demo_AllProducts 
(PKID int not null identity(1,1) primary key 
,DName Nvarchar(20) null 
,DCode NVarchar(30) null 
,DDate datetime null 

go 

--this SQL is only for SQL Server 2008 
Insert into Demo_AllProducts 
(DName,DCode,DDate) 
values 
(‘DemoA‘,‘AAA‘,GETDATE()), 
(‘DemoB‘,‘BBB‘,GETDATE()), 
(‘DemoC‘,‘CCC‘,GETDATE()), 
(‘DemoD‘,‘DDD‘,GETDATE()), 
(‘DemoE‘,‘EEE‘,GETDATE()) 

select * from Demo_AllProducts 

--PKID DName DCode DDate 
--1 DemoA AAA 2010-10-12 20:33:54.417 
--2 DemoB BBB 2010-10-12 20:33:54.417 
--3 DemoC CCC 2010-10-12 20:33:54.417 
--4 DemoD DDD 2010-10-12 20:33:54.417 
--5 DemoE EEE 2010-10-12 20:33:54.417 

if OBJECT_ID(‘Demo_Shop1_Product‘) is not null 
drop table Demo_Shop1_Product 
go 

Create table Demo_Shop1_Product 
(PKID int not null identity(1,1) primary key 
,DName Nvarchar(20) null 
,DCode NVarchar(30) null 
,DDate datetime null 

go 

--this SQL is only for SQL Server 2008 
Insert into Demo_Shop1_Product 
(DName,DCode,DDate) 
values 
(‘DemoA‘,‘AAA‘,GETDATE()), 
(‘DemoB‘,‘CCC‘,GETDATE()), 
(‘DemoF‘,‘FFF‘,GETDATE()) 

select * from Demo_Shop1_Product 

--PKID DName DCode DDate 
--1 DemoA AAA 2010-10-17 20:19:32.767 
--2 DemoB CCC 2010-10-17 20:19:32.767 
--3 DemoF FFF 2010-10-17 20:19:32.767 


假定现在需要将分店数据完全合并到总产品表中,以编码字段为依据,如果产品名称不致,则用分店的产品名称替换总产品名称。 

如果总产品表中不存在,则添加。 

可选项:如果分店表中不存在,则从总产品表中删除分店中没有的行。如果这样,总产品表和分店表就完全同步了。实际操作中可能不需要删除目标表的行。 

语句如下: 

复制代码代码如下:
--确定目标表 
Merge Into Demo_AllProducts p 
--从数据源查找编码相同的产品 
using Demo_Shop1_Product s on p.DCode=s.DCode 
--如果编码相同,则更新目标表的名称 
When Matched and P.DName<>s.DName Then Update set P.DName=s.DName 
--如果目标表中不存在,则从数据源插入目标表 
When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate) 
--如果数据源的行在源表中不存在,则删除源表行 
When Not Matched By Source Then Delete; 


此时,执行完成后,两个表的行均如下: 

复制代码代码如下:
--PKID DName DCode DDate 
--1 DemoA AAA 2010-10-17 20:31:00.827 
--2 DemoB CCC 2010-10-17 20:31:00.827 
--3 DemoF FFF 2010-10-17 20:31:00.827 


如果不删除,语句如下: 

复制代码代码如下:
--确定目标表 
Merge Into Demo_AllProducts p 
--从数据源查找编码相同的产品 
using Demo_Shop1_Product s on p.DCode=s.DCode 
--如果编码相同,则更新目标表的名称 
When Matched and P.DName<>s.DName Then Update set P.DName=s.DName 
--如果目标表中不存在,则从数据源插入目标表 
When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate); 


执行后结果: 

复制代码代码如下:
--PKID DName DCode DDate 
--1 DemoA AAA 2010-10-17 20:30:28.350 
--2 DemoB BBB 2010-10-17 20:30:28.350 
--3 DemoB CCC 2010-10-17 20:30:28.350 
--4 DemoD DDD 2010-10-17 20:30:28.350 
--5 DemoE EEE 2010-10-17 20:30:28.350 
--6 DemoF FFF 2010-10-17 20:31:00.827 

--PKID DName DCode DDate 
--1 DemoA AAA 2010-10-17 20:31:00.827 
--2 DemoB CCC 2010-10-17 20:31:00.827 
--3 DemoF FFF 2010-10-17 20:31:00.827 


如果需要记录Merge语句影响的行,可以用Output子句,如果仅仅需要知道影响的行数,可以使用@@ROWCOUNT或ROWCOUNT_BIG(),修改后的示例如下: 

复制代码代码如下:
--定义表变量以存储输出 
Declare @tableVarRecord Table 
(MPKID int not null identity(1,1) primary key 
,PKID int null 
,DName Nvarchar(20) null 
,DCode NVarchar(30) null 
,DDate datetime null 


--确定目标表 
Merge Into Demo_AllProducts p 
--从数据源查找编码相同的产品 
using Demo_Shop1_Product s on p.DCode=s.DCode 
--如果编码相同,则更新目标表的名称 
When Matched and P.DName<>s.DName Then 
Update set P.DName=s.DName 

--如果目标表中不存在,则从数据源插入目标表 
When Not Matched By Target Then 
Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate) 

--如果数据源的行在源表中不存在,则删除源表行 
When Not Matched By Source Then 
Delete OUTPUT deleted.* INTO @tableVarRecord; 
----Delete OUTPUT Inserted.* INTO @tableVarRecord; 

--返回上个Merge语句影响的行数 
select @@ROWCOUNT as Count1,ROWCOUNT_BIG() as Count2 

select * from @tableVarRecord; 


结果: 

复制代码代码如下:
--影响的行数 
--Count1 Count2 
--5 5 

--Deleted表的行 
--MPKID PKID DName DCode DDate 
--1 NULL NULL NULL NULL 
--2 2 DemoB BBB 2010-10-17 21:42:30.700 
--3 3 DemoC CCC 2010-10-17 21:42:30.700 
--4 4 DemoD DDD 2010-10-17 21:42:30.700 
--5 5 DemoE EEE 2010-10-17 21:42:30.700 

 

 

关于@@ROWCOUNT和ROWCOUNT_BIG()的更多说明,请查阅MSDN:

http://technet.microsoft.com/zh-tw/library/ms187316.aspx 

http://msdn.microsoft.com/en-us/library/ms181406.aspx

如果影响的结果超过20亿,即整型的最大范围,请使用后者。

SQL增强之Merge

标签:

热心网友 时间:2022-04-09 06:54

您好,他们作用差别很大啊,两个都是连表查询,CROSS APPLY 是把两个表合并成
一个集查询出来(品均行比如左表7行数据,右表5行查出来就会被整合成6行数据的集);CROSS
JOIN是左表和右表乘起来的(例如左表7行数据,右表5行数据,拿出来的集就是35行数据)。
cross
join是笛卡尔集的,通常没有join条件,通常是2个集合的关联(表、视图之间),如下:
select * from sys.objects

cross join sys.tables;
cross
apply是为用在给函数传值时,如果要把表或者视图里的很多值挨个传给函数,就用这个,如下:
select * from
sys.dm_exec_requests r
cross apply sys.dm_exec_sql_text(r.sql_handle) s;
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
正确的调搓丝板方法 正确的调搓丝板方法介绍 搓丝板失效的多种原因及如何预防? 副职领导签批公文技巧 上级审批意见怎么写 怎么卸摘网吧电脑上的“世界之窗”浏览器 怎么才能卸载世界之窗浏览器? 麻烦帮我翻译两个句子,谢谢,谢谢。 ...结构层次和结构关系 原理讲下 谢谢谢谢 老师讲过了我么听懂啊_百度... 这两个句子的主干是什么,谢谢谢谢 为什么会有人选择一辈子不结婚呢? b站度日如年成就是要连续签到吗? 电脑强行退出按那个键 b站签到断一天,以前签到天数是不是就没了??? 技术创新的两种表现形式 carhartt av与re什么区别 怎样关闭童锁 美国卡哈特中国有限公司上海代表处怎么样? 星际穿越男主角穿的外套是什么牌子的? 布朗迪奥服装怎么样布朗迪奥男装是什么档次的衣服,以前没有听说过这个牌子_百度问一问 触屏电脑锁屏怎么取消 植物灯的作用是什么? 植物灯和水族灯有什么区别 专门用来养植物,代替植物阳光照射的灯叫什么 植物灯有什么作用?? 植物灯是什么? 淘宝商城提到的一级类目是是什么? 什么是LED植物灯? 11、垃圾污染 淘宝网的所有商品一共分为多少个类别(大类别有多少,小类别有多少)? 保险理赔一二事,消费者为何会遇到拒赔? 按哪几个键可以强制关闭计算机? 黄油小牛角面包的做法,黄油小牛角面包怎么做 做牛角面包里面特别韧是为什么? 交换机怎么设置网关和DNS 在南航飞机上看到一部关于葡萄种植园的电影,片名好像是《恋恋葡萄园》 法国电影,关于葡萄园,求片名,有难度啊 什么时候需要给交换机的VLAN配置IP地址以及给交换机配置默认网关 愤怒的葡萄高清完整版电影 交换机在什么情况下需要配置默认网关 学生民兵连日常应该有些什么安排才合适呢? 二层交换机可配置网关吗? 为什么要给交换机配置默认网关呢 如何做一名合格的民兵 女人一定要知道的事情有哪些呢? 女人应该知道什么? 如何把mp3的kbps调高,也就是说默认32kbps的mp3如何变成128kbps的mp3? 中年之后,女人都应该知道的三件事是什么? 思科交换机网段种配置网关的作用是什么? 生活中,哪些事情是女人早晚要明白的? 人到中年,哪几个道理是女人一定要明白的?