亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何創建SQLServer函數將子查詢中的多行“連接”到單個分隔字段中?

如何創建SQLServer函數將子查詢中的多行“連接”到單個分隔字段中?

倚天杖 2019-06-14 16:27:46
如何創建SQLServer函數將子查詢中的多行“連接”到單個分隔字段中?為了舉例說明,假設我有兩個表,如下所示:VehicleID Name1         Chuck2         Larry LocationID VehicleID City1          1         New York2          1         Seattle3          1          Vancouver4          2         Los Angeles5          2         Houston我想寫一個查詢來返回以下結果:VehicleID Name    Locations1         Chuck   New York, Seattle, Vancouver2         Larry   Los Angeles, Houston我知道這可以使用服務器端游標來完成,即:DECLARE @VehicleID intDECLARE @VehicleName varchar(100)DECLARE @LocationCity varchar(100)DECLARE @Locations varchar(4000)DECLARE  @Results TABLE(   VehicleID int   Name varchar(100)   Locations varchar(4000))DECLARE VehiclesCursor CURSOR FORSELECT   [VehicleID], [Name]FROM [Vehicles]OPEN VehiclesCursorFETCH NEXT FROM VehiclesCursor INTO   @VehicleID, @VehicleNameWHILE @@FETCH_STATUS = 0BEGIN   SET @Locations = ''   DECLARE LocationsCursor CURSOR FOR   SELECT     [City]   FROM [Locations]   WHERE [VehicleID] = @VehicleID  OPEN LocationsCursor  FETCH NEXT FROM LocationsCursor INTO     @LocationCity  WHILE @@FETCH_STATUS = 0   BEGIN     SET @Locations = @Locations + @LocationCity    FETCH NEXT FROM LocationsCursor INTO       @LocationCity  END   CLOSE LocationsCursor  DEALLOCATE LocationsCursor  INSERT INTO @Results (VehicleID, Name, Locations) SELECT @VehicleID, @Name,    @LocationsEND     CLOSE VehiclesCursorDEALLOCATE VehiclesCursorSELECT * FROM @Results但是,正如您所看到的,這需要大量的代碼。我想要的是一個通用函數,它允許我這樣做:SELECT VehicleID     , Name     , JOIN(SELECT City FROM Locations WHERE VehicleID = Vehicles.VehicleID, ', ') AS LocationsFROM Vehicles這個是可能的嗎?或者類似的東西?
查看完整描述

3 回答

?
呼如林

TA貢獻1798條經驗 獲得超3個贊

如果使用的是SQLServer 2005,則可以使用for XML path命令。

SELECT [VehicleID]
     , [Name]
     , (STUFF((SELECT CAST(', ' + [City] AS VARCHAR(MAX)) 
         FROM [Location] 
         WHERE (VehicleID = Vehicle.VehicleID) 
         FOR XML PATH ('')), 1, 2, '')) AS LocationsFROM [Vehicle]

它比使用游標容易得多,而且似乎運行得相當好。


查看完整回答
反對 回復 2019-06-14
?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

我不相信在一個查詢中存在這樣的方法,但是您可以使用一個臨時變量來玩這樣的把戲:

declare @s varchar(max)set @s = ''select @s = @s + City + ',' from Locationsselect @s

它肯定比游標上的代碼少,而且可能更有效率。


查看完整回答
反對 回復 2019-06-14
  • 3 回答
  • 0 關注
  • 1365 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號