【问题标题】:Recursion In OracleOracle 中的递归
【发布时间】:2011-01-11 16:15:21
【问题描述】:

我在 oracle 中有下表:

Parent(arg1, arg2)

我想要关系父级的传递闭包。也就是我想要下表

Ancestor(arg1, arg2)

这在 Oracle 中怎么可能?

我正在做以下事情:

WITH Ancestor(arg1, arg2)  AS (

  SELECT p.arg1, p.arg2 from parent p
  UNION
  SELECT p.arg1 , a.arg2 from parent p,  Ancestor a 
  WHERE p.arg2 = a.arg1

)

SELECT DISTINCT * FROM Ancestor;

我得到了错误

*Cause:    column aliasing in WITH clause is not supported yet
*Action:   specify aliasing in defintion subquery and retry
Error at Line: 1 Column: 20

如何在没有列别名的情况下解决这个问题?

【问题讨论】:

    标签: oracle recursion


    【解决方案1】:
    WITH    Ancestor(arg1, arg2) AS
            (
            SELECT  p.arg1, p.arg2
            FROM    parent p
            WHERE   arg2 NOT IN
            (
                SELECT  arg1
                FROM    parent
            )
    
            UNION ALL
    
            SELECT  p.arg1, a.arg2
            FROM    Ancestor a 
            JOIN    parent p
            ON      p.arg2 = a.arg1
            )
    SELECT  *
    FROM    Ancestor
    

    Oracle11g 第 2 版起仅支持递归 CTE

    在早期版本中,使用CONNECT BY 子句:

    SELECT  arg1, CONNECT_BY_ROOT arg2
    FROM    parent
    START WITH
            arg2 NOT IN
            (
            SELECT  arg1
            FROM    parent
            )
    CONNECT BY
            arg2 = PRIOR arg1
    

    【讨论】:

    • 11g 准确地说是发布2
    【解决方案2】:

    Oracle 允许递归查询。 见:http://www.adp-gmbh.ch/ora/sql/connect_by.html

    当然,这些通常假设分层数据都在一个表中。将其拆分为单独的表格会使事情变得复杂。

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2017-04-12
      • 1970-01-01
      • 2015-01-08
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多