【SQL】通過Sql實現根據分組合並指定列內容的查詢 SamWang


問題:

  最近在做一個項目的時候,遇到這樣一個要求,模擬要求如下:  

ID  SName
1    張三
1    李四
2    劉六
2    王五

要的結果是
ID name
1  張三,李四
2  劉六,王五

即按ID組查詢,並將相同的ID對應SName內容通過逗號合並

 

解決思路:

  通過傳遞不同的id給函數,查詢出組合的SName並返回。

--創建測試表
IF NOT EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'StudentsInfo') AND OBJECTPROPERTY(id,N'IsUserTable')=1)
CREATE TABLE StudentsInfo
(
    Id INT,
    SName NVARCHAR(20)
)
GO

--添加測試數據
INSERT INTO StudentsInfo VALUES (1,'張三')
INSERT INTO StudentsInfo VALUES (1,'李四')
INSERT INTO StudentsInfo VALUES (2,'劉六')
INSERT INTO StudentsInfo VALUES (2,'王五')
GO

--創建函數
IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'GetStudentsInfoNamesByID') AND OBJECTPROPERTY(id,N'IsScalarFunction')=1)
    DROP FUNCTION GetStudentsInfoNamesByID
GO
CREATE FUNCTION GetStudentsInfoNamesByID(@Id INT)
    RETURNS NVARCHAR(4000)
AS
BEGIN
    DECLARE @SNames NVARCHAR(4000)
    SET @SNames = ''
    SELECT @SNames = @SNames+','+SName FROM StudentsInfo WHERE id = @Id
    RETURN STUFF(@SNames,1,1,'')
END
GO    

--查詢
SELECT id,dbo.GetStudentsInfoNamesByID(id) AS SNames FROM StudentsInfo GROUP BY id

 

總結:

  整體思路還是比較簡單的,但是很多時間都不怎么使用函數進行處理,這里也算拋磚引玉做個記錄。至於上面的效率問題怎么樣,就暫不做考慮了。

 

鏈接:

  下面這兩篇博文很不錯,用三種方法實現上面的要求,而且還有效率的對比,很細致,推薦一下!(感謝 CrazyJinn的分享)

  關於SQL函數效率的一些測試與思考
  關於SQL一對多關系轉換的效率思考(續)

 


免責聲明!

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



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