2010-08-26 112 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