#sql #filter #subquery #common-table-expression
Вопрос:
Мне нужно выяснить механизм SQL для использования 5 категорий, которые я рассчитал с помощью CTE, чтобы иметь возможность фильтровать мои общие результаты. Когда я «соединяю» с запятой: из таблицы,cte результаты умножаются. На самом деле у меня нет поля для правильного объединения из-за вычисления количества в cte.
Я чувствую, что это должен быть подзапрос в операторе where, но у меня есть 5 результатов, и я думаю, что это работает только с 1 результатом.
Я пробовал (в меру своих возможностей) cte, различные подзапросы, наличие, существует
Рабочий CTE:
DECLARE @END VARCHAR(25)='2021-04-04 23:59:59.000' --Sunday
DECLARE @START DATEtime = DATEADD(DD,-364,@END)
;With CTE as (
Select Top 5
TIER_3
,COUNT(INCIDENT_NUMBER) AS CTE_Count
FROM vIncidentTickets
WHERE LAST_RESOLVED_DATE between @START and @END
AND GROUP = 'Cell'
AND COMPANY = 'HQ'
AND ORGANIZATION = 'CSS'
GROUP BY TIER_3
ORDER BY COUNT(INCIDENT_NUMBER) DESC
)
—Выбранная часть не дает правильных результатов
Select
INCIDENT_NUMBER
,CTE.TIER_3
FROM vIncidentTickets,CTE
WHERE LAST_RESOLVED_DATE between @START and @END
AND GROUP = 'Cell'
AND COMPANY = 'HQ'
AND ORGANIZATION = 'CSS'
Я хочу, чтобы результаты CTE фильтровали запрос Select.
Ответ №1:
НЕ присоединяйтесь, используя запятую. Стандарту использования JOIN
ключевых слов почти 30 лет, привыкайте к нему и используйте его.
При использовании INNER JOIN
, в частности, становится ясно, что вы не включили никаких условий для связи двух таблиц (без предиката соединения).
Попробуйте вместо этого вот это…
Select
v.INCIDENT_NUMBER
,CTE.TIER_3
FROM
vIncidentTickets AS v
INNER JOIN
CTE
ON CTE.TIER_3 = v.TIER_3
WHERE
v.LAST_RESOLVED_DATE between @START and @END
AND v.GROUP = 'Cell'
AND v.COMPANY = 'HQ'
AND v.ORGANIZATION = 'CSS'
(Ваш исходный запрос был эффективно использован CROSS JOIN
.)