programing

Oracle에서의 재귀

lovejava 2023. 9. 21. 20:00

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

칼럼 앨리어싱 없이 어떻게 해결할 수 있을까요?

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

Oracle재귀적만 지원합니다.CTE부터11g릴리스 2.

이전 버전에서는 다음을 사용합니다.CONNECT BY조항:

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

Oracle은 재귀적 쿼리를 허용합니다.참조: http://www.adp-gmbh.ch/ora/sql/connect_by.html

물론 계층 데이터가 모두 한 테이블에 있다고 가정합니다.그것을 각각의 테이블로 나누는 것은 일을 복잡하게 만듭니다.

언급URL : https://stackoverflow.com/questions/4659803/recursion-in-oracle