Essa é uma pergunta meio subjetiva.
Se eu tiver um CTE recursivo, algo como:
WITH RECURSIVE r(x, y) AS ( ...
SELECT x, y -- select1
FROM t WHERE ..
UNION
SELECT t.x, t.y -- select2
FROM r JOIN t
ON ...
)
SELECT x, y
FROM r
Qual é exatamente o objetivo de especificar a lista de colunas como um argumento na definição de CTE? Se eu não especificar, ele pega a lista de colunas no arquivo SELECT
.
Se eu especificar, toda vez que quiser fazer alterações, tenho que refletir isso nos SELECT
s do CTE e também na lista de argumentos.
Que benefício eu ganho escrevendo WITH RECURSIVE r(x, y) AS
em vez de apenas WITH RECURSIVE r AS
?
Isso vem do padrão SQL. É outra opção para nomear as colunas do CTE.
Está correto. Se você não especificar, a lista de colunas no SELECT é usada (e se for uma consulta UNION/INTERSECT/EXCEPT, a lista de colunas na primeira delas. A 2ª lista e as seguintes são ignoradas).
Incorreta. Se você alterar os nomes na "lista de argumentos", não precisará fazer nenhuma alteração na lista SELECT. A lista de argumentos substitui os nomes da lista SELECT. Você só precisa alterar ambos se adicionar mais ou remover colunas do CTE.