@Xeldos

Как соединить два подзапроса, и потом агрегировать результат одного из них?

Коллеги, я туплю. Помогите скрестить ежа и ужа.
Мне нужно для каждой строки из набора данных получить набор признаков, и объединить эти признаки в одну строку. Вроде стандартная задача.
Вариант 1:
WITH
    cte1 as (SELECT * FROM get_data()),
    cte2 as (
        SELECT
            flag
        FROM
            cte1
            CROSS APPLY check_flag(cte1.key) as checker
        WHERE
            checker.filter=1
    )
SELECT
    cte1.*, stuff((SELECT ','+flag FROM cte2 FOR XML PATH ''), 1, 1, '')

Не годится, так как нет соединения между подзапросами, и я всегда получаю полный набор флагов.
Вариант 2:
WITH
    cte1 as (SELECT * FROM get_data()),
    cte2 as (
        SELECT
            flag, cte1.key
        FROM
            cte1
            CROSS APPLY check_flag(cte1.key) as checker
        WHERE
            checker.filter=1
    )
SELECT
    cte1.*,
    stuff((SELECT ','+flag FROM cte2 WHERE cte1.key = cte2.key FOR XML PATH ''), 1, 1, '')

Не годится, так как запрос выполняется 30 секунд (хотя это хорошо, был ещё вариант, который считался 2 минуты). Понятно, почему 30 секунд, соединение идёт в предложении SELECT, то есть я по сути фильтрую здоровенное декартово произведение.
Как бы мне и соединить два подзапроса нормальным образом, через FROM, и потом агрегировать результат?
  • Вопрос задан
  • 125 просмотров
Решения вопроса 1
@Xeldos Автор вопроса
SELECT gd.*, STUFF (t.flags, 1, 1, '')
FROM get_data() gd
CROSS APPLY (
    SELECT ',' + flag
    FROM check_flag(gd.key)
    WHERE filter = 1
    FOR XML PATH ('')
) t(flags)


Спасибо unfilled
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы