【发布时间】:2016-06-11 00:43:26
【问题描述】:
我在 Oracle 中遇到递归查询问题。
我目前能够通过在 SQL Server 中使用 CTE 获得结果,但我必须针对 Oracle 调整代码。
我使用的代码是
WITH n(portefeuille, client, level, opcvm, ca, iter) AS
(
SELECT
portefeuille, client, 0 as level, opcvm, ca,
CAST(',' + CAST(portefeuille AS varchar) + ',' AS varchar) AS iter
FROM
dbo.chiffres
WHERE
opcvm IS NULL
UNION ALL
SELECT
m.portefeuille, n.client, n.level+1, m.opcvm, m.ca + n.ca,
CAST(iter + CAST(m.portefeuille AS varchar) + ',' AS varchar) AS iter
FROM
dbo.chiffres AS m
INNER JOIN
n ON n.portefeuille = m.opcvm
)
SELECT DISTINCT
n.level, n.client, n.portefeuille, n.ca , n.opcvm, iter,
(SELECT COUNT(*)
FROM n T1
WHERE T1.iter LIKE '%,' + CAST(n.portefeuille AS varchar) + ',%') - 1 AS Subordinates
FROM
n, dbo.chiffres c
WHERE
((SELECT COUNT(*)
FROM n T1
WHERE T1.iter LIKE '%,' + CAST(n.portefeuille AS varchar) + ',%') - 1) = 0
ORDER BY
level
我认为我必须在 oracle 中使用'connect by',但我不知道如何使用它。
事实上,在我的最终代码中,我应该使用“select.....”而不是表 dbo.chiffres。
这个“选择....”的结果是(只是一个例子)
Client | portefeuille | CA | OPCVM
31054 | 024 | 140 | NULL
104900 | 034 |200 | 024
31054 | 006 | 10 | NULL
而我想要的最终结果是
level | Client | portefeuille | CA | iter | subordinates
0 | 31054 | 034 | 340 | ,024,034, |0
1 | 31054 | 006 | 10 | ,006, |0
【问题讨论】:
-
CTE 在 Oracle 中工作(在文档中称为子查询因式分解子句)——您应该能够相当轻松地移植它。将
level重命名为lvl-level是分层查询中使用的关键字,不能用作别名。 -
感谢您的回答。我想我尝试了这个解决方案,但我收到错误“缺少 SELECT 关键字”。事实上,我的问题有点复杂,因为我没有表 dbo.chiffres 而是使用“选择 ....”来代替。这可能是问题的根源吗?
-
我在帖子中添加了一些细节来解释我的问题。
标签: sql oracle recursive-query