要實現(xiàn)的SQL查詢很原始:
要求從第一個表進(jìn)行查詢得到第二個表格式的數(shù)據(jù),上網(wǎng)查詢之后竟然能寫出下面的SQL:
復(fù)制代碼代碼如下:
select * from userino
SELECT * FROM(
SELECT DISTINCT userpart
FROM userino
)A
OUTER APPLY(
SELECT
[usernames]= replace(replace(replace((SELECT username as value FROM userino N
WHERE userpart = A.userpart order by n.username asc FOR XML AUTO),'"/>
)N
OUTER APPLY(
SELECT
[username_cns]= replace(replace(replace((SELECT username_cn as value FROM userino M
WHERE userpart = A.userpart order by m.username asc FOR XML AUTO),'"/>
)M
現(xiàn)將SQL進(jìn)行一下分析:
總共使用到的點有:OUTER APPLY,F(xiàn)OR XML AUTO,
很有意思的SQL多行數(shù)據(jù)拼接
。由于對SQL Server沒有很深的研究,所以記錄一下OUTER APPLY 是SQL2005開始支持的一種查詢方法,類似于連接查詢,是將兩個查詢結(jié)果進(jìn)行拼接,但是奇特的是,使用OUTER APPLY竟然能夠在Apply后面的查詢中使用前面已經(jīng)得到的查詢結(jié)果。
如:
復(fù)制代碼代碼如下:
select * from
(select * from userino) A
cross join (select username from userino
where username = A.username )B
select * from
(select * from userino) A
join (select username from userino ) B on a.username = b.username
select * from
(select * from userino) A
OUTER APPLY (select username from userino
where username = A.username ) B
第一段SQL顯然是錯的,有兩個原因:1.Cross Join本來就是無條件的,2. SQl Server會爆出如下錯誤:
The multi-part identifier "A.username" could not be bound.
大家可能會說有條件的Join查詢本來就不是這樣寫的,應(yīng)該寫為第二條SQL這樣的樣子,其實這樣寫和第三條SQL中使用Outer apply 實現(xiàn)的效果是一樣的
可是 Outer Apply還能實現(xiàn)如下的效果
復(fù)制代碼代碼如下:
select * from
(select * from userino) A
OUTER APPLY (select [value] = a.username+'test' ) B
這個恐怕直接使用join就有點麻煩了,上面的例子也許沒什么意義,其實SQL2005提出Apply連接方法主要是為了在連接查詢中使用已經(jīng)執(zhí)行的查詢語句的結(jié)果
除了“OUTER APPLY”,SQL Server還有CROSS APPLY,之間的區(qū)別主要是在Null值的處理上
FOR XML AUTO 主要用于將SQL的查詢結(jié)果直接返回成XML語句,F(xiàn)or Xml 除了auto外 還有RAW和EXPLICIT,詳見《超級簡單:使用FOR XML AUTO控制XML輸出》
在文章剛開始提出的SQL文,就是使用了上面的兩個特性,首先使用Outer Apply來實現(xiàn)類似于使用userpart進(jìn)行分組的效果,來分別篩選出各個userpart中的user,然后由于篩選出的結(jié)果是多行,所以使用 for xml 來把多行數(shù)據(jù)拼接成xml,最后很二的對xml進(jìn)行拆分....
綜上,感覺這種實現(xiàn)方式比較獨特,又學(xué)習(xí)了SQL Server中的一些特性,和大家分享一下
QQ空間 搜狐微博 人人網(wǎng) 開心網(wǎng) 百度搜藏更多
Tags:SQL 數(shù)據(jù)拼接
復(fù)制鏈接收藏本文打印本文關(guān)閉本文返回首頁
上一篇:設(shè)置密碼保護(hù)的SqlServer數(shù)據(jù)庫備份文件與恢復(fù)文件的方法
下一篇:SQL SERVER 2000通訊管道后復(fù)用劫持
相關(guān)文章
2010-06-06SQLServer中臨時表與表變量的區(qū)別分析
2013-01-01SQLserver中用convert函數(shù)轉(zhuǎn)換日期格式的方法
2012-12-12SQL數(shù)據(jù)庫日志已滿解決方法
2012-10-10Sql Server中存儲過程中輸入和輸出參數(shù)(簡單實例 一看就懂)
2012-07-07sqlserver數(shù)據(jù)庫主鍵的生成方式小結(jié)(sqlserver,mysql)
2012-10-10delete from 表名與truncate table 表名區(qū)別
2012-06-06在SQL Server中使用SQL語句查詢一個存儲過程被其它所有的存儲過程
2009-07-07數(shù)據(jù)轉(zhuǎn)換沖突及轉(zhuǎn)換過程中大對象的處理
2007-01-01最長用最基本的MSSQL數(shù)據(jù)庫備份與還原
2013-09-09判斷數(shù)據(jù)庫表是否存在以及修改表名的方法
文章評論
最 近 更 新
SQL判斷字段列是否存在的方法
使用xp_cmdshell注銷Windows登錄用戶(終端
sqlserver 系統(tǒng)存儲過程 中文說明
顯示 Sql Server 中所有表中的信息
通過sql存儲過程發(fā)送郵件的方法
在SQL Server中使用命令調(diào)用SSIS包的具體
通過分析SQL語句的執(zhí)行計劃優(yōu)化SQL
sql查詢出各科成績最好的學(xué)生信息
快速插入大量數(shù)據(jù)的asp.net代碼(Sqlserve
uniqueidentifier轉(zhuǎn)換成varchar數(shù)據(jù)類型的
熱 點 排 行
SQL Server 2008圖文安裝教程
SQL Server 2012 安裝圖解教程(附
sqlserver中distinct的用法(不重
SQL Server導(dǎo)入、導(dǎo)出、備份數(shù)據(jù)
SQL語句去掉重復(fù)記錄,獲取重復(fù)記
SQL Server數(shù)據(jù)庫入門學(xué)習(xí)總結(jié)
SQL Server錯誤代碼大全及解釋(
sql convert函數(shù)使用小結(jié)
sql 時間函數(shù) 整理的比較全了
用SQL語句添加刪除修改字段、一些