В 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 в подзапросе.