問題:
最近在做一個項目的時候,遇到這樣一個要求,模擬要求如下:
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一對多關系轉換的效率思考(續)