Проще говоря, набор результатов запроса, который определяет CTE, должен возвращать набор столбцов с разными именами. Например, следующее не будет работать:
with cte as (select 1 as x, 2 as x)
select * from cte;
В наборе результатов есть 2 столбца с именем "x". В таком случае вы ДОЛЖНЫ указать имена столбцов в определении cte, поскольку запрос создает набор результатов с повторяющимися именами. Поэтому вам нужно будет использовать форму:
with cte(x, y) as (select 1 as x, 2 as x)
select * from cte;
Как правило, для любого набора результатов рекомендуется, чтобы НЕ имели повторяющиеся имена столбцов.