【问题标题】:Sql select query helpsql选择查询帮助
【发布时间】:2011-04-04 09:11:21
【问题描述】:

我有一个数据库表,数据如下:

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

我想编写一个查询,它将获取 Column1 中的所有不同值并为每个 Column1 值附加 Column2 中的值。 例如:查询应该返回

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

**Utah Jazz     | Malone**

**Orlando Magic | Hardaway**

我可以编写一个查询来获取 column1 中的所有不同值,然后在进行一些操作后遍历每个不同的值以获取附加的第 2 列。是否可以仅在一个查询中完成整个工作?请帮助提供查询示例。 谢谢。

【问题讨论】:

  • 您使用的是什么 DMBS?
  • 事实上,这里有一套相当全面的方法可以在不同的 RDBMS 中解决这个问题 - 可能与 How do I Create a Comma-Separated List using a SQL Query? 重复
  • 您绝对应该在您的问题中提前说明这一点!看起来你需要to create a user defined aggregate
  • @Martin:很抱歉没有包括在内。你能举个例子吗?我无法理解您提供的链接中的内容。谢谢。
  • @Fishina... 我没有 SQL derby 可玩。如果您能找到他们在该链接中讨论的getMedianTestScore 的代码并将其粘贴到您的问题中,我会看一下。

标签: sql derby


【解决方案1】:

如果您使用的是 MySQL

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

【讨论】:

  • 这并没有给 OP 他正在寻找的最终结果。
  • 你知道吗?我误读了您的解决方案。更准确地错过了“group_concat”...... 反对票改为赞成票。我的错。
  • @Dutchie - 酷。感谢您的逆转!
  • H2数据库也支持group_concat。
【解决方案2】:

如果您使用的是 SQL Server:

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 更改为查找表,否则下次犹他州搬家时,您会讨厌生活;)

【讨论】:

【解决方案3】:

此类问题的一般解决方案是聚合函数 ARRAY_AGG(),它返回一个数组,其中包含不同行中的值,可选择按某些标准排序。此功能已针对 SQL 标准的下一版本提出。 GROUP_CONCAT() 函数是一种特殊情况,它将数组转换为逗号分隔的字符串。

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

【讨论】:

  • 从 cmets 发现 OP 实际上是在使用“java derby”
  • 帖子没有提及。德比还没有这种能力。因此,如果他愿意,这些答案可能会帮助他选择替代方案。
【解决方案4】:

SQL Anywhere 有一个 list() aggregation 函数十多年以来就是为了这个目的。

如果您使用的是 SQL Server,那么除了在某种程度上滥用 XML 的棘手解决方案之外,您可以用任何 .net 语言编写自己的聚合函数。而Microsoft documentation of this feature正是以字符串拼接的情况为例。

【讨论】:

  • 从 cmets 发现 OP 实际上是在使用“java derby”
  • 哦,我写答案时它有 sql-server 作为标签。
猜你喜欢
  • 2011-05-14
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2010-10-20
相关资源
最近更新 更多