我想从表中检索层次结构数据集,并在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使用所有列而无需显式列出所有列?
如果不需要递归定义的列,则之后再将它们连接起来:
select t.*
from cte join
t
on cte.id = t.id
为了执行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;
我希望这有助于获得所有列。