SQL点点滴滴_特殊用法笔记
声明:
本文为转载,感谢原作者的辛勤付出。 原博客地址为:http://www.cnblogs.com/icyJ/p/SQL_Statement.html
1、MERGE用法:关联两表,有则改,无则加
create table #AAA(id int,A int,AA int,AAA int,B int)
create table #BBB(A int,B int) insert into #AAA select 1,1,1,1,null union select 2,2,2,2,null union select 3,3,3,3,null union select 4,4,4,4,null
insert into #BBB select 1,10 union select 2,20 union select 3,30 union select 6,60 merge into #AAA as t
using (select * from #BBB where A<30 )as s
on s.A=t.A
when matched then update set t.B=s.B
when not matched by target then insert values(0,s.A,0,0,s.B)
when not matched by source then update set t.B=0
output $action as [Action],
Inserted.id as InsertId,
Inserted.B as InsertB,
Deleted.id as DeletedId,
Deleted.B as DeletedB; 2、ROW_NUMBER用法:分组取第一行
create table #AAA(id int,A int,B int,C int,Flag int)
insert into #AAA values(1,1,1,1,0),(2,1,2,2,0),(3,2,3,3,1),(4,2,4,4,0) select * from
(select A,B,rn=ROW_NUMBER() over (partition by A order by C)
from #AAA
where Flag=0) t0
where rn=1
drop table #AAA
扩展用法:
1. 删除重复数据,思路:按照一定的排序保留第一条,删除rn>1的数据。
2. row_Number的Over语句中,如果不想做排序操作,可以输入order by(select null)
3、READPAST大用
说明:READPAST是一个table hints,实际应用场景可以是多线程处理一批任务,Update/Delete任务时用ReadPast可以跳过行锁,提高效率。
DELETE a OUTPUT deleted.* FROM dbo.Test a WITH (UPDLOCK, READPAST)
4.、CTE(公用表表达式):优雅清晰的代码
create table #AAA(orderId varchar(20), packId varchar(20), skuId varchar(20), resentSign bit, resent int)
create table #BBB(orderId varchar(20), skuId varchar(20), resent int) insert into #AAA values
('S01','P01','A',null,null)
,('S03','P01','C',1,20)
,('S01','P02','A',null,null)
,('S01','P01','B',null,null)
,('S02','P01','A',null,null)
,('S02','P03','B',null,null)
insert into #BBB values
('S01','A',10); with cteTest as
(
select t3.*,t2.resent as newResent from
(select t1.packId,t1.SkuId,t0.resent from
(select orderId,skuId,resent from #BBB) t0
left join (select orderId,packId,SkuId from #AAA)t1
on t1.orderId=t0.orderId and t1.SkuId=t0.skuId) t2
left join (select * from #AAA where resentSign is null) t3
on t3.packId=t2.packId and t3.SkuId=t2.SkuId
)
update cteTest set ResentSign=1, resent=newResent
提示:
1. with前如果有SQL语句,必须以;结尾,否则报错,因此可以习惯在With前加;的写法。
2. with加上merge的写法,更加优雅。但是值得注意的是,merge的表对象可以用with过滤查找,但MS官方不推荐这么做,有失败的风险。
5、探究SQL中的null和空字符
declare @testOne nvarchar(30)
set @testOne=' ' select @testOne as Content
,case when @testOne = ' ' then ' = empty' else '= empty false' end as EmptyTest
,case when @testOne != ' ' then '!= empty' else '!= empty false' end as NotEmptyTest
,case when @testOne = null then '= Null' else '= Null false' end as NotEmptyTest
,case when @testOne != null then '!= Null' else '!= Null false' end as NotNullTest
6、STUFF:查询group并串联String
create table #AAA(id int, Col1 varchar(10))
insert into #AAA values (3,'吃饭'),(3,'运动'),(2,'打球'),(1,'跳舞'),(1,'看电影') Select distinct ST2.id,
stuff((Select ','+Col1-- as [text()]--无列名
From #AAA ST1
Where ST1.id = ST2.id
For XML PATH ('')
),1,1,'') Col1s
From #AAA ST2 drop table #AAA
7、 OUTPUT用法:增删改的同时OUTPUT数据
create table #OldData(id int, A varchar(30), B varchar(30))
create table #IdMap(OldId int,[NewId] uniqueidentifier)
create table #NewData(id uniqueidentifier, A varchar(30), B varchar(30), oldId int) insert into #OldData values (1,'A','B'),(2,'Ads','Bwe'),(3,'frA','erB'),(4,'erA','Bty') --写入新数据同时写到Id映射表
insert into #NewData
output inserted.OldId,inserted.id AS [NewId] into #IdMap
select newid() as newGuid,A,B,id from #OldData drop table #OldData
drop table #IdMap
drop table #NewData
8、CTE递归一
如上如:A表为一个树形结构:
目标:将结构打散成二级,结果数据为:节点,父节点,父子深度。
create table #AAA(id int, pid int,v int)
insert into #AAA values (0,null,0),(1,0,1),(2,0,2),(3,0,3),(4,1,4),(5,1,5),(6,2,6),(7,4,7),(8,2,8),(9,6,9) SELECT * FROM #AAA ;with cte as
(
select Id,Pid,0 as lvl,Id as flag from #AAA union all
select d.Id,d.Pid,lvl+1,c.flag from cte c inner join #AAA d
on d.Id = c.Pid
where c.lvl<10--这里加2表示只取2次递归的结果。
)
select flag AS subId,Id AS dadId, Lvl
FROM cte
ORDER BY cte.flag,cte.lvl desc drop table #AAA
9、CTE递归二
目标:将数据分组并向上累加。V(0,0)=1,V(0,1)=3,V(0,2)=8处理成V(0,0)=1,V(0,1)=3+1=4,V(0,2)=8+3+1=12
create table #AAA(gpid int, rn int, v int)
insert into #AAA values (0,0,1),(0,1,3),(0,2,8),(1,0,5),(1,1,1),(2,0,1),(2,1,10),(2,2,3),(2,3,-1),(3,0,6) ;with cte as
(
select gpid,rn,v from #AAA WHERE rn=0 union all
select d.gpid,d.rn,d.v+c.v AS v FROM cte c inner join #AAA d
on d.gpid = c.gpid AND d.rn =c.rn+1
)
SELECT * FROM cte ORDER BY gpid,cte.rn DROP table #AAA
10、解析xml子数据并join到父数据
目标:将父数据中的xml子数据解读并对每条子数据生成一条包含父数据信息的数据行
SQL语句:
---- 创建函数解析xml成table
--alter FUNCTION [dbo].[F_GetDetails]
--(
-- @detailxml nvarchar(4000)
--)
--RETURNS @t TABLE(id int, amount DECIMAL(12,4))
--AS
--BEGIN -- --解析xml
-- declare @xml xml
-- set @xml=cast(@detailxml as xml) -- INSERT INTO @t
-- select T.c.value('@id','int') as Id,
-- T.c.value('@amount','decimal(12,4)') as Amount
-- from @xml.nodes('As/A') as T(c) -- RETURN;
--END DECLARE @tmp TABLE(id INT,name NVARCHAR(30),xmlDetail NVARCHAR(1000))
INSERT INTO @tmp VALUES
(1, 'A',N'<?xml version="1.0" encoding="utf-16"?>
<As>
<A id="1" amount="1.3900" />
<A id="2" amount="19.0000" />
<A id="3" amount="2.2200" />
</As>')
,(2, 'B',N'<?xml version="1.0" encoding="utf-16"?>
<As>
<A id="4" amount="9.3600" />
<A id="5" amount="10.5000" />
<A id="6" amount="2.1500" />
</As>') SELECT * FROM @tmp a
CROSS apply dbo.[F_GetDetails](a.xmlDetail) b
SQL点点滴滴_特殊用法笔记的更多相关文章
- SQL点点滴滴_聪明的小写法(持续更新中)
1.生成序列号 SELECT number + 1 ,number FROM master..spt_values WHERE type = 'P' ORDER BY number 说明: maste ...
- SQL点点滴滴_查看所有存储过程或视图的位置及内容
代码:select a.name,a.[type],b.[definition] from sys.all_objects a,sys.sql_modules b where a.is_ms_ship ...
- SQL点点滴滴_判断字段或者字符中是否包含有特殊字符
SQL Server中,如果我们想判断一个字符串或者数据字段中是否包含有特殊字符.可以使用正则来实现.除了大小字母和数字之外全是特殊字符[^a-zA-Z0-9]
- SQL点点滴滴_查询类型和索引-转载
当您考虑是否要对列创建索引时, 请估计在查询中使用列的方式, 下表介绍了索引对其有用的查询类型. 表中的示例基于 AdventureWorks2008R2 示例数据库, 在 SQL Server Ma ...
- SQL点点滴滴_修改数据库的兼容级别
语法 ALTER DATABASE database_name SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 } 参数 database_name 要修改的数据库 ...
- SQL点点滴滴_常用函数
该文章转载自http://www.cnblogs.com/jiajiayuan/archive/2011/06/16/2082488.html 别人的总结,很详细. 以下所有例子均Studnet表为例 ...
- SQL点点滴滴_公用表表达式(CTE)递归的生成帮助数据
本文的作者辛苦了,版权问题特声明本文出处:http://www.cnblogs.com/wy123/p/5960825.html 工作有时候会需要一些帮助数据,必须需要连续的数字,连续间隔的时间点,连 ...
- SQL点点滴滴_聚集索引设计指南-转载
聚集索引基于数据行的键值在表内排序和存储这些数据行, 每个表只能有一个聚集索引, 因为数据行本身只能按一个顺序存储. 有关聚集索引体系结构的详细信息, 请参阅 聚集索引结构. 每个表几乎都对列定义聚集 ...
- SQL点点滴滴_非聚集索引设计指南-转载
非聚集索引包含索引键值和指向表数据存储位置的行定位器. 有关非聚集索引体系结构的详细信息, 请参阅 非聚集索引结构. 可以对表或索引视图创建多个非聚集索引. 通常, 设计非聚集索引是为改善经常使用的没 ...
随机推荐
- (转)Mysql占用过高CPU时的优化手段
Mysql占用CPU过高的时候,该从哪些方面下手进行优化?占用CPU过高,可以做如下考虑:1)一般来讲,排除高并发的因素,还是要找到导致你CPU过高的哪几条在执行的SQL,show processli ...
- Struts2方法调用的三种方式(有新的!调用方法的说明)
在Struts2中方法调用概括起来主要有三种形式 第一种方式:指定method属性 <action name="heroAction" class="com.ABC ...
- Types方法之isSameType-isSuperType-isSubType
4.isSameType() 方法 /** * Is t the same type as s? */ public boolean isSameType(Type t, Type s) { retu ...
- unity批量设置图片为etc2格式或者astc格式
网上找了半天,没一个能用的,干脆自己写个,直接拷贝这个脚本就行 这个是ios版本的,安卓的话写在注释里面,去掉注释就能用了 现在ios支持一种新格式叫astc比原本的pvrtc压缩比更高,而且质量更高 ...
- 微电子中的die-to-die和within-die
工艺制造中lot指按某种方式生成的硅柱状体,将这些lot切成薄片就称为wafer,wafer是进行集成电路制造的基板,一般以直径来区分,8寸.10寸,12寸等,或者以毫米来区分.直径越大材料的利用率越 ...
- 数据库索引--------B/B+树、聚集、非聚集、符合索引
摘录自博客:http://www.cnblogs.com/morvenhuang/archive/2009/03/30/1425534.html 一.引言 对数据库索引的关注从未淡出我的们的讨论,那么 ...
- SQL:存储过程
1/什么是存储过程及概念 Transact-SQL中的存储过程,非常类似于.Net语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可 ...
- Delphi 通得进程ID获取主窗口句柄
只知道进程ID,获取主窗口句柄的方法如下: 通过EnumWindows枚举所有窗口 使用GetWindowThreadProcessID,通过窗口句柄获取进程ID 比便获取的进程ID与当前已知的进程I ...
- HandlerInterceptor与MethodInterceptor
HandlerInterceptor是springMVC项目中的拦截器,它拦截的目标是请求的地址,比MethodInterceptor先执行.实现一个HandlerInterceptor拦截器可以直接 ...
- e.pageX、e.clientX、e.screenX、e.offsetX的区别以及元素的一些CSS属性
e.pageX,e.pageY:返回的值是相对于文档的定位,文档的左上角为(0,0),向右为正,向下为正,IE不支持: e.clientX,e.clientY:返回的值是相对于屏幕可见区域的坐标,如果 ...