1. MERGE用法:關聯(lián)兩表,有則改,無則加

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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,nullinsert into #BBB select 1,10 union select 2,20 union select 3,30 union select 6,60merge into #AAA as t
using (select * from #BBB where A<30 )as son s.A=t.Awhen matched then update set t.B=s.Bwhen not matched by target then insert values(0,s.A,0,0,s.B)when not matched by source then update set t.B=0output $action as [Action],
    Inserted.id as InsertId,
    Inserted.B as InsertB,
    Deleted.id as DeletedId,
    Deleted.B as DeletedB;

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

詳細說明和更多用法參見:https://msdn.microsoft.com/zh-cn/library/bb510625.aspx

 

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

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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) t0where rn=1drop table #AAA

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

擴展用法:

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(公用表表達式):優(yōu)雅清晰的代碼

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

提示:

1. with前如果有SQL語句,必須以;結尾,否則報錯,因此可以習慣在With前加;的寫法。

2. with加上merge的寫法,更加優(yōu)雅。但是值得注意的是,merge的表對象可以用with過濾查找,但MS官方不推薦這么做,有失敗的風險。

詳細說明和更多用法參見:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx

 

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

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

 

6. STUFF:查詢group并串聯(lián)String

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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 ST2drop table #AAA

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

詳細說明和更多用法參見:https://msdn.microsoft.com/zh-cn/library/ms190922.aspx

 

7. OUTPUT用法:增刪改的同時OUTPUT數據

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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 #IdMapselect newid() as newGuid,A,B,id from #OldDatadrop table #OldDatadrop table #IdMapdrop table #NewData

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

詳細說明和更多用法參見:https://msdn.microsoft.com/zh-cn/library/ms177564.aspx

 

8. CTE遞歸一

如上如:A表為一個樹形結構:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

目標:將結構打散成二級,結果數據為:節(jié)點,父節(jié)點,父子深度。

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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, LvlFROM cteORDER BY cte.flag,cte.lvl descdrop table #AAA

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

詳細說明和更多用法參見:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx

 

9. CTE遞歸二

 電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

目標:將數據分組并向上累加。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語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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.rnDROP table #AAA

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

詳細說明和更多用法參見:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx

 

10. CTE遞歸三

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

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 ctFROM(    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

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

 

 

11.解析xml子數據并join到父數據

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

目標:將父數據中的xml子數據解讀并對每條子數據生成一條包含父數據信息的數據行

SQL語句:

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

---- 創(chuàng)建函數解析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;--ENDDECLARE @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

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

詳細說明和更多用法參見: https://msdn.microsoft.com/zh-cn/library/ms177634.aspx

 

 

 

未完待續(xù)。。。。

轉載請注明出處:http://www.cnblogs.com/icyj

Top

推薦

收藏

關注

評論

分類: 開發(fā) - SQL

好文要頂 關注我 收藏該文 電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓 電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

icyjiang
關注 - 26
粉絲 - 88

+加關注

2

上一篇:mysql筆記一——安裝和設置root密碼
下一篇:RabbitMQ內存爆出

posted @ 2017-04-07 17:36 icyjiang 閱讀(369) 評論(0) 編輯 收藏

刷新評論刷新頁面返回頂部

注冊用戶登錄后才能發(fā)表評論,請 登錄 或 注冊,訪問網站首頁。

【推薦】50萬行VC++源碼: 大型組態(tài)工控、電力仿真CAD與GIS源碼庫
【免費】從零開始學編程,開發(fā)者專屬實驗平臺免費實踐!

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

最新IT新聞:
· 樂視問題超預期?四個交易日融創(chuàng)股價下跌超11%
· 比特幣帶火顯卡 漲價四成仍難求
· Pippin Barr帶你重溫Windows 95年代的PC工作環(huán)境
· 歐盟開發(fā)機器人“獾”,用于地下挖掘
· 樂視危機加劇 供應商仁寶電腦面臨2300萬美元壞債
更多新聞...

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

最新知識庫文章:

· 小printf的故事:什么是真正的程序員?
· 程序員的工作、學習與績效
· 軟件開發(fā)為什么很難
· 唱吧DevOps的落地,微服務CI/CD的范本技術解讀
· 程序員,如何從平庸走向理想?

更多知識庫文章...

歷史上的今天:
2015-04-07 MVC的JavaScriptResult使用

電腦培訓,計算機培訓,平面設計培訓,網頁設計培訓,美工培訓,Web培訓,Web前端開發(fā)培訓

歡迎光臨我的網站: 
www.viyip.com 
www.ycaiy.com

昵稱:icyjiang
園齡:5年8個月
粉絲:88
關注:26

+加關注

<2017年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

隨筆分類

友情鏈接

積分與排名

  • 積分 - 144736

  • 排名 - 1591

最新評論

閱讀排行榜

評論排行榜

推薦排行榜

Copyright ?2017 icyjiang

分享

http://www.cnblogs.com/icyJ/p/SQL_Statement.html