这是一个主观的问题。
如果我有一个递归 CTE,例如:
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
在 CTE 定义中将列列表指定为参数究竟有什么意义?如果我不指定它,它无论如何都会采用SELECT
.
如果我确实指定了它,那么每次我想要进行更改时,我都必须SELECT
在 CTE 的 s 和参数列表中反映出来。
WITH RECURSIVE r(x, y) AS
我从写作而不是仅仅写作中获得什么好处WITH RECURSIVE r AS
?
这来自 SQL 标准。命名 CTE 的列是另一种选择。
那是对的。如果您不指定它,则使用 SELECT 中的列列表(如果它是 UNION/INTERSECT/EXCEPT 查询,则使用其中第一个列的列表。第二个和后面的列表将被忽略)。
不正确。如果更改“参数列表”中的名称,则不必在 SELECT 列表中进行任何更改。参数列表覆盖 SELECT 列表名称。如果您添加更多列或从 CTE 中删除列,则只需更改两者。