【发布时间】:2011-08-12 19:19:37
【问题描述】:
在 PostgreSQL 中,有一个非常有用的 string_agg 函数,它允许查询如下:
SELECT
contacts.first_name,
contacts.last_name,
(
SELECT
string_agg(number, ', ' ORDER BY phones.priority)
FROM
phones
WHERE
phones.contact_id = contacts.id
) AS phone_numbers
FROM
contacts
同样,这可以在 MySQL 中使用 group_concat 完成。
现在,我正在尝试将其作为 CLR 用户定义的聚合移植到 SQL Server 中。代码本身不是问题,因为整个网络上有数千个示例来创建这个特定的聚合(这引出了一个问题:为什么它还不是 SQL Server 的一部分??)。
问题是,我找不到一个干净的方式来应用 ORDER BY,因为 SQL Server 不仅不支持聚合函数中的 ORDER BY,它还禁止在子查询中使用 ORDER BY。我最好的选择是:
SELECT
contacts.first_name,
contacts.last_name,
(
SELECT
dbo.string_agg(number, ', ')
FROM
(
SELECT TOP <some really large number>
number
FROM
phones
WHERE
phones.contact_id = contacts.id
ORDER BY
phones.priority
) AS phones
) AS phone_numbers
FROM
contacts
有没有更好的解决方法?是的,我已经阅读了Is order by clause allowed in a subquery,我敢说,这是子查询中 ORDER BY 的一个有效用例。
【问题讨论】:
标签: sql-server postgresql sql-order-by aggregate