2012-03-06 118 views
-1

我有一個名爲SerialNos有以下的列表: 標識,PARENT_ID,的SerialNoretrive逗號分隔值

在PARENT_ID 像有不同的SerialNo:

Id  Parent_Id SerialNo  
1   16   abc    
2   16   def    
3   23   hij    
4   23   klm  
5   23   nop  

我只想檢索逗號分隔的SerialNos。對於特定的Parent_Id ,例如如果Parent_Id通過了16,那麼O/p應該是:'abc,def' ,如果Parent_Id通過23,那麼O/p應該是:'hij,klm,nop'

+1

可能重複的[基於ID的連接值](http://stackoverflow.com/questions/6603319/concatenate-values-based-on-id) – 2012-03-06 10:18:37

回答

1

here是一個很好的黑客:

DECLARE @csv varchar(1000) 
SELECT @csv = COALESCE(@csv+',','') + SerialNo 
FROM SerialNos 
WHERE Parent_Id = 23 
SELECT @csv 
+0

你添加的尾隨逗號怎麼樣? – gbn 2012-03-06 10:27:23

1

根據數據庫服務器可以使用group_concat。例如,如果你正在使用帶有「,」分隔符的mysql group_concat,將會給你你後面的結果。 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

如果您正在使用不同的數據庫服務器檢查其文檔,它可能會有類似的東西。請記住,有些數據庫沒有這個功能。

對不起,只是看到您的文章被標記爲sql-server2008。如果sql server 2008沒有group_concat或類似的東西嘗試此鏈接 http://blog.shlomoid.com/2008/11/emulating-mysqls-groupconcat-function.html

對不起又一次編輯,這將有所幫助。 http://groupconcat.codeplex.com/

+0

-1用於回答多次提問之前的問題 – gbn 2012-03-06 10:21:08

+0

對不起,在問這個問題之前,我一直認爲這是提問人員檢查計算器的責任! – Orlymee 2012-03-06 10:28:58

+0

+1,因爲此答案不符合標準值得讚賞。 「每當你遇到一個極其潦草,毫不費力的帖子,或者一個明顯而且可能危險不正確的答案時,使用你的低估。」 – Cameron 2012-03-06 10:44:15

1

爲SQL 2008服務器可以使用下面的查詢(與你的表名):

select distinct STUFF(ISNULL((SELECT ', ' + x.SerialNo 
       FROM TableA x 
       WHERE x.Parent_Id= t.Parent_Id 
      GROUP BY x.SerialNo 
      FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') 
from TableA t 
where Parent_Id = 16 
1

那麼我可以指點我的博客後here,但不幸的是它不在英國:)。 Here是類似的,只是沒有CLR。 有我知道至少4個解決方案:

  • CLR分組功能(當然,code是英文)
  • 可使用光標(不是非常快)
  • 可以使用類似遊標
  • 可以使用XML

所以一個解決方案(不是最快的,但容易寫):

Create Function fn_MyFunction 
(
    @Parent_Id int 
) 
Returns NVarChar(1000) 
As 
Begin 
    Declare @txt NVarChar(1000) 

    SELECT @txt = COALESCE(@txt + ';' + SerialNo, SerialNo) 
    FROM dbo.Table Where Parent_Id = @Parent_Id 
    Return @txt 
End