SQL中將某個表中的多行數據在一個字段顯示


項目需求:將某個表中的多行數據在一個字段顯示,如下:

比如表A中有字段 ID,NAME,

表B中有字段ID,PID,DES,

表A,表B中的數據分別如下:

ID NAME
1 張三
2 李四

ID PID DES
1 1 語文
2 1 數學
3 1 外語
4 2 歷史
5 2 地理

最終我想顯示的效果為:

ID NAME KC
1 張三 語文,數學,外語
2 李四 歷史,地理

方法:使用sql中的STUFF函數與for xml path

 1.for xml path是將將查詢結果集以XML形式展現

比如對於表B,select * from b for xml path('')

得到的結果集如下:

<ID>1</ID>
<PID>1</PID>
<DES>語文</DES>
<ID>2</ID>
<PID>1</PID>
<DES>數學</DES>
<ID>3</ID>
<PID>1</PID>
<DES>外語</DES>
<ID>4</ID>
<PID>2</PID>
<DES>歷史</DES>
<ID>5</ID>
<PID>2</PID>
<DES>地理</DES>
View Code

這里數據集不是作為多行數據展示

2.stuff函數的用法為:stuff(param1, startIndex, length, param2)
說明:將param1中自startIndex(SQL中都是從1開始,而非0)起,刪除length個字符,然后用param2替換刪掉的字符。

因此,將多行數據轉換為一行的格式寫法為:

select ID as ID,Name as NAME,
(select stuff((select ','+DES from b where b.PID=a.ID for xml path('')),1,1,'')) as KC
from a 

 

補充STUFF 的詳細說明

STUFF ( character_expression , start , length ,character_expression ) 
參數 
character_expression 
一個字符數據表達式。character_expression 可以是常量、變量,也可以是字符列或二進制數據列。

start 
一個整數值,指定刪除和插入的開始位置。如果 start 或 length 為負,則返回空字符串。如果 start 比第一個character_expression 長,則返回空字符串。start 可以是 bigint 類型。

length 
一個整數,指定要刪除的字符數。如果 length 比第一個 character_expression 長,則最多刪除到最后一個character_expression 中的最后一個字符。length 可以是 bigint 類型。

返回類型 
如果 character_expression 是受支持的字符數據類型,則返回字符數據。如果 character_expression 是一個受支持的 binary 數據類型,則返回二進制數據。


備注 
如果開始位置或長度值是負數,或者如果開始位置大於第一個字符串的長度,將返回空字符串。如果要刪除的長度大於第一個字符串的長度,將刪除到第一個字符串中的第一個字符。 
如果結果值大於返回類型支持的最大值,則產生錯誤。


示例 
以下示例在第一個字符串 abcdef 中刪除從第 2 個位置(字符 b)開始的三個字符,然后在刪除的起始位置插入第二個字符串,從而創建並返回一個字符串。

SELECT STUFF('abcdef', 2, 3, 'ijklmn'); 
GO

下面是結果集: 
--------- 
aijklmnef

 

 

原文出處:https://www.cnblogs.com/IceNewMan/p/5707470.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM