处理递归 cte 中的大量列

Dealing with a lot of columns in a recursive cte

我想从 table 中检索分层结构化数据集,我在 this post 中找到了 sql-server 的解决方案。将在那里找到的解决方案移植到 oracle dosnt 相当有效。看来我必须在我的案例中指定一个别名列表,如下所示:

WITH cte ( ID ) AS (
  SELECT  T.ID
  FROM SomeTable T
  WHERE T.ID = 1
  UNION ALL
  SELECT  T.ID
  FROM SomeTable T
  INNER JOIN cte C
  ON T.BASE_ID = C.ID
)
SELECT *
from cte;

我现在遇到的问题是 SomeTable 有 200 列,我需要很多列。我不能只用 SELECT T.* 替换 with 语句中的选择,因为我会收到 ORA-01789: query block has incorrect number of result columns 错误,除非我将所有列添加到别名列表(这是有道理的)。对于给定的 table.

这当然会相当笨重

oracle-sql 有没有办法告诉 cte 使用所有列而不需要显式列出所有列?

执行 UNION ALL 所需的列数相同。

查看 Oracle 参考:The UNION ALL, INTERSECT, MINUS Operators

我假设 SOMETABLE 有 200 列。 我创建了一个具有两个表达式的 With 子句。 第一个表达式 cte1 将包含所有列。 第二个表达式 cte2 使用第一个表达式 (cte1).

获取数据
WITH cte1 AS (
SELECT T.*
FROM SOMETABLE T
WHERE T.ID = 1),
cte2 AS(SELECT C.*
FROM SOMETABLE T
INNER JOIN cte1 C ON T.BASE_ID = C.ID
)
SELECT * FROM cte2;

我希望这有助于获取所有列。

如果您不需要递归定义的列,只需在之后加入它们:

select t.*
from cte join
     t
     on cte.id = t.id