Page 41 - SQL
P. 41

)
         SELECT * FROM ManagedByJames;


          Level   ID   FName         LName


          1       1    James         Smith


          2       2    John          Johnson

          3       4    Johnathon     Smith


          2       3    Michael       Williams



        Oracle CONNECT BY functionality with recursive CTEs


        Oracle's CONNECT BY functionality provides many useful and nontrivial features that are not
        built-in when using SQL standard recursive CTEs. This example replicates these features (with a
        few additions for sake of completeness), using SQL Server syntax. It is most useful for Oracle
        developers finding many features missing in their hierarchical queries on other databases, but it
        also serves to showcase what can be done with a hierarchical query in general.


           WITH tbl AS (
                SELECT id, name, parent_id
                  FROM mytable)
              , tbl_hierarchy AS (
                /* Anchor */
                SELECT 1 AS "LEVEL"
                     --, 1 AS CONNECT_BY_ISROOT
                     --, 0 AS CONNECT_BY_ISBRANCH
                     , CASE WHEN t.id IN (SELECT parent_id FROM tbl) THEN 0 ELSE 1 END AS
         CONNECT_BY_ISLEAF
                     , 0 AS CONNECT_BY_ISCYCLE
                     , '/' + CAST(t.id   AS VARCHAR(MAX)) + '/' AS SYS_CONNECT_BY_PATH_id
                     , '/' + CAST(t.name AS VARCHAR(MAX)) + '/' AS SYS_CONNECT_BY_PATH_name
                     , t.id AS root_id
                     , t.*
                  FROM tbl t
                 WHERE t.parent_id IS NULL                            -- START WITH parent_id IS NULL
                UNION ALL
                /* Recursive */
                SELECT th."LEVEL" + 1 AS "LEVEL"
                     --, 0 AS CONNECT_BY_ISROOT
                     --, CASE WHEN t.id IN (SELECT parent_id FROM tbl) THEN 1 ELSE 0 END AS
         CONNECT_BY_ISBRANCH
                     , CASE WHEN t.id IN (SELECT parent_id FROM tbl) THEN 0 ELSE 1 END AS
         CONNECT_BY_ISLEAF
                     , CASE WHEN th.SYS_CONNECT_BY_PATH_id LIKE '%/' + CAST(t.id AS VARCHAR(MAX)) +
         '/%' THEN 1 ELSE 0 END AS CONNECT_BY_ISCYCLE
                     , th.SYS_CONNECT_BY_PATH_id   + CAST(t.id   AS VARCHAR(MAX)) + '/' AS
         SYS_CONNECT_BY_PATH_id
                     , th.SYS_CONNECT_BY_PATH_name + CAST(t.name AS VARCHAR(MAX)) + '/' AS
         SYS_CONNECT_BY_PATH_name
                     , th.root_id
                     , t.*
                  FROM tbl t



        https://riptutorial.com/                                                                               23
   36   37   38   39   40   41   42   43   44   45   46