2010-08-26 175 views
5

我有一個數據的數據庫表如下所示:SQL SELECT查詢幫助

Primary key | Column1  | Column2   | col3 | col4 |col5 
--------------------------------------------------------------------- 

1   | Chicago Bulls | Michael Jordan | 6'6 | aaaa | cccc 

2   | Chicago Bulls | Scottie Pippen | 6'8 | zzzz | 345 

3   | Utah Jazz  | Malone   | 6'9 | vvvv | xcxc 

4   | Orlando Magic | Hardaway   | 6'7 | xnnn | sdsd 

我想編寫一個查詢,將在獲取所有列1不同的值,並附加列2值每列1的值。 對於如:查詢應返回

**Chicago Bulls | Michael Jordan, Scottie Pippen** 

**Utah Jazz  | Malone** 

**Orlando Magic | Hardaway** 

我可以編寫一個查詢來獲取列1中所有不同值,然後遍歷每個不同的值一些操作後得到附加的第2列。只有一個查詢可以完成整個工作嗎?請幫助一個查詢的例子。 謝謝。

+0

你在用什麼DMBS? – 2010-08-26 16:40:47

+0

事實上,在這裏有一個相當全面的方法來解決這個不同的關係型數據庫管理系統 - 可能重複[如何使用SQL查詢創建一個逗號分隔列表?](http://stackoverflow.com/questions/1817985/how-do-i-create-a-comma-separated-list-using-a-sql-query) – 2010-08-26 16:43:34

+0

正在使用java derby ... – Fishinastorm 2010-08-26 17:01:32

回答

5

如果您如果使用的是SQL Server中使用MySQL的

select Column1, group_concat(Column2) 
from t 
group by Column1  
+0

這並沒有給OP他正在尋找的最終結果。 – Dutchie432 2010-08-26 16:49:17

+0

@Dutchie - 爲什麼不呢?看起來對我來說是正確的。 – 2010-08-26 16:49:55

+0

你知道嗎?我誤解了你的解決方案。更準確地說錯過了「group_concat」......將投票改爲投票。我的錯。 – Dutchie432 2010-08-26 16:52:30

2

SELECT Column1, 
stuff((
    SELECT ', ' + Column2 
    FROM tableName as t1 
    where t1.Column1 = t2.Column1 
    FOR XML PATH('') 
    ), 1, 2, '') 
FROM tableName as t2 
GROUP BY Column1 

不知道爲什麼微軟使這一個這麼辛苦,但據我所知,這是唯一的方法在SQL Server中執行此操作...

在旁註中,您可能會考慮將Column1更改爲查找表或下次猶他州移動時,您將會討厭生活;)

+0

+1我認爲這是SQL Server中最好的方法有[其他可能性](http://www.projectdmx.com/tsql/rowconcatenate.aspx),但效率並不高,不保證排序。另外你可能想看看[這裏](http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/07/06/871.aspx),以便阻止它轉義特殊的XML字符 – 2010-08-26 17:01:22

+1

播音員:「玩對於芝加哥公牛隊的得分後衛我們有> & <前身爲邁克爾喬丹!!!「 (人羣狂奔) – 2010-08-26 17:05:16

0

這種類型的問題的一般解決方案是集合函數ARRAY_AGG(),該函數返回包含不同行中的值的數組,可選地按照某些條件排序。該功能已被提議用於下一版SQL標準。 GROUP_CONCAT()函數是將數組轉換爲逗號分隔字符串的特例。

最新的HSQLDB 2.0.1支持ARRAY_AGG()和GROUP_CONCAT()。 http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#N12312

+0

從評論中發現,OP實際上使用「java derby」 – 2010-08-27 18:31:37

+0

該帖子沒有提到它。德比目前還沒有這種能力。因此,如果他願意,答案可能有助於他選擇替代方案。 – fredt 2010-08-27 23:18:19

0

SQL Anywhere有一個list() aggregation函數,因爲十多年來就是爲了這個目的。

如果您使用的是SQL Server,那麼除了在某種程度上濫用XML的棘手解決方案之外,您可以使用任何.net語言編寫自己的聚合函數。並且Microsoft documentation of this feature正好以字符串連接的情況爲例。

+0

從評論中發現,OP實際上使用「java derby」 – 2010-08-27 18:30:58

+0

哦,當我寫回答時,它有sql-server作爲標記。 – Frank 2010-08-27 18:48:06