Портирование PostgreSQL string_agg на SQL Server, проблема с ORDER BY - PullRequest
5 голосов
/ 26 апреля 2011

В 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.

Теперь я пытаюсь перенести это в SQL Server в качестве пользовательского агрегата CLR. Сам код не является проблемой, так как в Интернете есть тысячи примеров для создания этого конкретного агрегата (который задает вопрос: почему он уже не является частью 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

Есть ли лучший обходной путь? И да, я прочитал Допускается ли упорядочение по предложению в подзапросе , и это, осмелюсь сказать, действительный вариант использования ORDER BY в подзапросе.

Ответы [ 2 ]

0 голосов
/ 21 мая 2011

Похоже, нет лучшей альтернативы, чем использование подзапроса с TOP <some really large number>, чтобы обойти ограничение 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
0 голосов
/ 26 апреля 2011

Ваш запрос на лучшую ставку не даст желаемых результатов. Когда ORDER BY используется с TOP в подобном подзапросе, ORDER BY используется только для оценки верхнего условия. На самом деле он не упорядочивает данные за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...