sql >> Databáze >  >> RDS >> Oracle

Rekurze v Oracle

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 podporuje pouze rekurzivní CTE od 11g Vydání 2.

V dřívějších verzích použijte CONNECT BY klauzule:

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


  1. Jak funguje IsFinite() v PostgreSQL

  2. GROUP BY s MAX (DATE)

  3. Jaké je výchozí pořadí seznamu vráceného z volání filtru Django?

  4. Rails 3.1 - Pushing to Heroku - Chyby při instalaci postgres adaptéru?