【问题标题】:Porting PostgreSQL string_agg to SQL Server, problem with ORDER BY将 PostgreSQL string_agg 移植到 SQL Server,ORDER BY 的问题
【发布时间】: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


    【解决方案1】:

    您的最佳匹配查询不会返回您想要的结果。当 ORDER BY 在这样的子查询中与 TOP 一起使用时,ORDER BY 仅用于评估顶部条件。它实际上并没有为您订购数据。

    【讨论】:

    • 我已将“TOP 100 PERCENT”替换为“TOP ”,这似乎奏效了。
    【解决方案2】:

    看起来没有比使用带有TOP &lt;some really large number&gt; 的子查询更好的替代方法来绕过 SQL Server 的限制:

    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
    

    【讨论】:

      猜你喜欢
      • 2017-02-24
      • 2017-06-13
      • 2021-12-30
      • 1970-01-01
      • 2021-12-07
      • 2010-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多