Прежде всего, даже если вы сделали его CTE, имейте в виду, что, поскольку у вас дважды в запросе CTE (расчески), выполняется CROSS JOIN TWICE !
Во-вторых, как только это станет ясно, вам нужно только перенести идентификаторы и в конце соединиться, чтобы получить текст.
Первая часть действительно
select
token,
class,
DocumentFk
from (--> expanded = tokens cross join classes <--)
inner join dbo.Documents_Classes on classid = ClassFk
group by token, DocumentFk, class
Что означает,действительно нет никакого значения, добавляющего CLASSES к соединению, так как оно завершено при помощи Documents_Classes.Первая часть также может быть написана
select
token_id,
class_id,
DocumentFk
from TOKENS
CROSS join dbo.Documents_Classes
--group by token_id, DocumentFk, class_id
Следующее, что следует отметить, это то, что CROSS JOIN по определению делает GROUP BY бесполезным - они всегда уникальны.
Вторая часть упрощает
select
token_id,
class_id,
DocumentFk
from CLASSES
CROSS join dbo.Documents_Tokens
Поскольку
- КРЕСТ соединяет все классы (с документами) с токенами;и
- B CROSS объединяет все токены (с документами) в классы
Пересечение - это просто просто токены, которые существуют в документах. INNER JOIN классы, которые существуют в документах одного документаНапример,
select C.text class, T.text token, count(DC.DocumentFk) as CountDocument
from Documents_Classes DC
inner join Documents_Tokens DT on DC.DocumentFk = DT.DocumentFk
inner join Classes C on DC.classFk = c.id
inner join Tokens T on DT.tokenFk = t.id
group by C.text, T.text, C.id, T.id