处理递归cte中的许多列

问题描述 投票:1回答:3

我想从表中检索层次结构数据集,并在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错误,除非我将所有列都添加到别名列表中(这很有意义)。对于给定的表,那当然是相当笨拙的。

oracle-sql是否有一种方法可以告诉cte使用所有列而无需显式列出所有列?

sql oracle common-table-expression recursive-query
3个回答
2
投票

如果不需要递归定义的列,则之后再将它们连接起来:

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

0
投票

为了执行UNION ALL,需要相同的列数。

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


0
投票

我假设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;

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

© www.soinside.com 2019 - 2024. All rights reserved.