Коллеги, я туплю. Помогите скрестить ежа и ужа.
Мне нужно для каждой строки из набора данных получить набор признаков, и объединить эти признаки в одну строку. Вроде стандартная задача.
Вариант 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, и потом агрегировать результат?