SQL Server特殊用法笔记

声明:

本文为转载,感谢原作者的辛勤付出。 原博客地址为: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可以跳过行锁,提高效率。

SQL语句:

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

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

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

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

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

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

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
 
时间: 2025-01-03 09:11:20

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

SQL Server技术内幕笔记合集

SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnblogs.com/lyhabc/articles/3914213.html Microsoft SQL Server 2005技术内幕:T-SQL查询笔记http://www.cnblogs.com/lyhabc/articles/3912608.html Microsoft SQL Server 2

SQL SERVER 时间相关操作笔记

1.DATEADD函数: A.  MSDN上的示例:http://msdn.microsoft.com/zh-cn/library/ms186819%28v=sql.90%29.aspx B. SQL2005上的示例 1 ----定义变量 2 DECLARE @start DATETIME,@end DATETIME 3 SET @start='2014-01-01' 4 SET @end='2014-06-16' 5 6 ---- 计算月份 7 SELECT DATEADD(YEAR,-6,@

SQL SERVER 2014--学习笔记1

--======================================================= 在SQL SERVER 2014中,最吸引眼球的就是内存表和本地编译存储过程,在MS强大的宣传下,内存表和本地编译存储过程似乎成了能搞定一切的救世主,这是真的吗? 让我们一步一步来学习探索吧 --======================================================= 创建数据库 由于内存表数据的存放机制和普通表(基于磁盘的表)完全不同,因此内

SQL Server 2012 数据库笔记

慕课网 首页 实战 路径 猿问 手记 Python 手记 \ SQL Server 2012 数据库笔记 SQL Server 2012 数据库笔记 2016-10-25 16:29:33 123浏览 0评论 第一章 初识SQL Server2012 1.2.作为SQL Server的最新版本,SQL Server 2012具有以下激动人心的新功能. 1.AlwaysOn. 2.Columnstore索引. 3.DBA自定义服务器权限. 4.Windows Server Core支持. 5.Se

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集 XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB"> <Order orderid="10692" orderdate="2007-10-03T00:00:00&

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据 XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你需要一个查询处理引擎. SQL Server 数据库通过XML数据类型方法的T-SQL 语句来处理XQuery. SQL Server 并不支持所有的X

SQL Server LocalDB 学习笔记 02 基本管理

管理LocalDB 1. SqlLocalDB命令 安装完毕之后,可以看看环境变量中的Path,一般都会有 %ProgramFiles%\Microsoft SQL Server\110\Tools\Binn 这个就是SqlLocalDB存放的位置,如果在cmd之下不生效,编辑按钮点一下(什么都不改),之后确定,最后外层确定,就让新的Path生效了. 创建数据库实例 c SqlLocalDB create "实例名字" -s 参数-s可选,加上之后表示创建之后直接启动实例 删除数据库实

SQL Server LocalDB 学习笔记 01 简介

SQL Server 2012 新增产品 SQL Sever Express轻量级版本 转为开发人员创建 无需管理 兼用T-SQL语言 编程接口与SQL Server Express一样 适用于小型应用环境.嵌入式环境 好处:无需再笔记本安装维护一个庞大的SQL Server实例了. 特性: 兼容其他SQL Server版本,使用sqlservr.exe作为服务进程,使用相同的客户端访问接口,兼容T-SQL编程语言. 无需安装多个LocalDB,不同程序可以并行执行多个LocalDB进程,所有的

SQL Server数据库基础笔记

启动和停止SQL Server服务三种形式 后台启动服务 计算机->右键->管理->服务和应用程序->服务->sql server(MSSQLSERVER) SQL Server配置管理器启动服务 开始->安装路径->配置工具->sql server配置管理器 在运行窗口中使用命令启动和停止服务 Windows(键)+r 启动SQL Server服务:net start mssqlserver 停止SAL Server服务:net stop mssqlser