【问题标题】:SQL recursive query (Oracle)SQL 递归查询 (Oracle)
【发布时间】: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


【解决方案1】:

类似这样的:

WITH n(portefeuille, client, lvl, opcvm, ca, iter) AS (
  SELECT  portefeuille,
          client,
          0,
          opcvm,
          ca,
          ',' || portefeuille
  FROM    dbo.chiffres
  WHERE   opcvm is null 
UNION ALL
  SELECT  m.portefeuille,
          n.client,
          n.lvl+1,
          m.opcvm,
          m.ca+n.ca,
          iter || m.portefeuille || ','
FROM      dbo.chiffres m
          inner join n
          on n.portefeuille = m.opcvm
)
select distinct
       n.lvl,
       n.client,
       n.portefeuille,
       n.ca ,
       n.opcvm,
       iter,
       ( SELECT COUNT(*)
                FROM n T1
                WHERE T1.iter LIKE '%,' || n.portefeuille || ',%'
       ) - 1 AS Subordinates
from   n,
       dbo.chiffres c
where ((SELECT COUNT(*) FROM n T1 WHERE T1.iter LIKE '%,' || n.portefeuille || ',%') - 1) = 0
order by lvl

我没有任何表格可以测试它,但我有

  • level 重命名为lvl(因为level 是分层查询中使用的关键字)。
  • 字符串连接运算符在 Oracle 中是 ||,而不是 +
  • 删除了所有演员表 - 我认为您不需要它们。

【讨论】:

    猜你喜欢
    • 2020-11-27
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多