1. MERGE用法:关联两表,有则改,无则加

SQL语句:

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;

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/bb510625.aspx

2. ROW_NUMBER用法:分组取第一行

SQL语句:

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)

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/ms186734.aspx

3. READPAST大用

说明:READPAST是一个table hints,实际应用场景可以是多线程处理一批任务,Update/Delete任务时用ReadPast可以跳过行锁,提高效率。

SQL语句:

DELETE a OUTPUT deleted.* FROM dbo.Test a WITH (UPDLOCK, READPAST)

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/ms187373.aspx

4. CTE(公用表表达式):优雅清晰的代码

SQL语句:

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官方不推荐这么做,有失败的风险。

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx

5. 探究SQL中的null和空字符

SQL语句:

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

SQL语句:

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

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/ms190922.aspx

7. OUTPUT用法:增删改的同时OUTPUT数据

SQL语句:

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

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/ms177564.aspx

8. CTE递归一

如上如:A表为一个树形结构:

目标:将结构打散成二级,结果数据为:节点,父节点,父子深度。

SQL语句:

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

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx

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

SQL语句:

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

详细说明和更多用法参见:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx

10. CTE递归三

SQL语句:

DECLARE @tmp TABLE(id INT, value VARCHAR(30))
INSERT INTO @tmp VALUES (1,'a'), (2,'a'), (3,'a'), (4,'b'), (5,'b'), (6,'a'), (7,'a'), (8,'c') ;WITH cte AS
(
SELECT *,[key]=id, ct = 1 FROM @tmp
UNION ALL
SELECT d.id, d.value,c.[key], c.ct+1 AS ct
FROM cte c INNER JOIN @tmp d ON d.id=c.id+1 AND d.value = c.value
) SELECT rn = ROW_NUMBER() OVER (ORDER BY b1.[key]) ,b1.value,COUNT(1) AS ct
FROM(
SELECT *,rn=ROW_NUMBER() OVER(PARTITION BY id ORDER BY cte.[key])
FROM cte
) b1 WHERE b1.rn=1
GROUP BY b1.[key],b1.value

11.解析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

12. SQL SERVER2012取前一行后一行

;WITH product(id,name)
AS
(
select 10,N'你' union all
select 11,N'我' union all
select 13,N'他' union all
select 17,N'她' union all
select 20,N'它'
) SELECT
*
FROM (SELECT id,LAG(id,1,0)OVER(ORDER BY id) AS 前一行ID,LEAD(id,1,0)OVER(ORDER BY id) AS 后一行ID FROM Product ) AS t
WHERE Id=10

目标:取前一行/前几行的值,没有值的话指定默认值。

详细说明和更多用法参见: https://msdn.microsoft.com/zh-cn/library/ms177634.aspx

未完待续。。。。

转载请注明出处:http://www.cnblogs.com/icyj

SQL Server特殊用法笔记的更多相关文章

  1. SQL Server技术内幕笔记合集

    SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...

  2. SQL Server 2012 数据库笔记

    慕课网 首页 实战 路径 猿问 手记     Python 手记 \ SQL Server 2012 数据库笔记 SQL Server 2012 数据库笔记 2016-10-25 16:29:33 1 ...

  3. 《Troubleshooting SQL Server》读书笔记-CPU使用率过高(下)

    <Troubleshooting SQL Server>读书笔记-CPU使用率过高(下) 第三章 High CPU Utilization. CPU使用率过高的常见原因 查询优化器会尽量从 ...

  4. C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用

    C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备)  https://blog.csdn.net/u013519551/article/details/51220841 1. . ...

  5. SQL Server 数据库基础笔记分享(下)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  6. SQL Server 数据库基础笔记分享(上)

    前言 本文是个人学习SQL Server 数据库时的以往笔记的整理,内容主要是对数据库的基本增删改查的SQL语句操作和约束,视图,存储过程,触发器的基本了解. 注:内容比较基础,适合入门者对SQL S ...

  7. SQL Server的安装笔记

    SQL安装笔记 安装SQL Server 2008 打开SQL Server 2008中的setup.exe,显示SQL安装程序的对话框. 提示必须安装相关组件Microsoft.NET Framew ...

  8. SQL Server 2012 学习笔记5

    1. 索引(Index) 索引是快速的定位和查找数据.索引分为: 聚集索引:唯一,默认主键,一般选取比较连贯的字段,聚集索引是物理排序. 非聚集索引: 并没有把数据物理排序,只是多了一个索引页(包括索 ...

  9. SQL Server 2012 学习笔记1

    1. 新建的数据库会产生两个文件(数据文件.mdf 和日志文件.ldf) 2. 编辑表格和为表格录入数据 "Design"为设计表格,"Edit Top 200 Rows ...

随机推荐

  1. c++类的构造函数详解

    c++类的构造函数详解 一. 构造函数是干什么的 class Counter{ public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类 ...

  2. c++ STL常用算法使用方法

    #include <string> #include <vector> #include <functional> #include <iostream> ...

  3. 【开源】NodeJS仿WebApi路由

    用过WebApi或Asp.net MVC的都知道微软的路由设计得非常好,十分方便,也十分灵活.虽然个人看来是有的太灵活了,team内的不同开发很容易使用不同的路由方式而显得有点混乱. 不过这不是重点, ...

  4. 【CNMP系列】CentOS7.0下安装MySql5.6服务

    接上一回的话,CentOS7.0下安装好了Nginx服务,对于我们的CNMP,我们可以开始我们的M啦,就是传统意义上的MySql服务 MySql简介 MySQL是一个关系型数据库管理系统,由瑞典MyS ...

  5. 用js,css3 做的一个球

    用css3属性很容易做一个立方体,但是要做一个球体,会相对复杂些 原理是:球可以看做是由无数个圆圈构成,然后就可以用圆圈来做球, 下面的例子是我做的一个小球,由72个圆圈组成.如果把每个圆圈的背景颜色 ...

  6. 屏幕适配基础——了解:ppi、dpi、px、sp、dp

    做android开发绕不开的几个名词:ppi.dpi.px.sp.dp.那么它们的定义.区别和联系都是什么呢?这篇博客系统的做一个概述和总结. 1.基本概念 px:pixel,像素,电子屏幕上组成一幅 ...

  7. Flume-ng源码解析之Sink组件

    作为启动流程中第二个启动的组件,我们今天来看看Sink的细节 1 Sink Sink在agent中扮演的角色是消费者,将event输送到特定的位置 首先依然是看代码,由代码我们可以看出Sink是一个接 ...

  8. JS一周游~(基础、运算符、条件语句)

    一.基础篇 JavaScript 基于浏览器(客户端).基于(面向)对象{没有继承}.事件驱动(要有对象).脚本语言(灵活多变) 1.作用 表单的验证,减轻服务端的压力 添加页面动画效果 动态更改页面 ...

  9. cocos2dx 中文路径编译错误记录

    '/Q' 不是内部或外部命令,也不是可运行的程序1> 或批处理文件.1> 'y' 不是内部或外部命令,也不是可运行的程序1> 或批处理文件.1>C:\Program Files ...

  10. 每天一个Linux命令 1

    nl命令在Linux系统中用来计算文件中行号.nl可以将输出的文件内容自动的加上行号!其默认的结果与cat -n有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动补齐0等等的功能. 1 ...