表层次结构概念

时间:2021-07-02 15:32:18

标签: sql oracle

WITH T AS (
           SELECT  /*+ MATERIALIZE */
                   C1.OWNER,
                   C1.TABLE_NAME,
                   C1.CONSTRAINT_NAME,
                   C1.CONSTRAINT_TYPE,
                   C1.STATUS,
                   C2.OWNER PARENT_OWNER,
                   C2.TABLE_NAME PARENT_TABLE_NAME,
                   C2.CONSTRAINT_NAME PARENT_CONSTRAINT_NAME,
                   C2.CONSTRAINT_TYPE PARENT_CONSTRAINT_TYPE,
                   COUNT(CASE C1.CONSTRAINT_TYPE WHEN 'R' THEN 1 END) OVER(PARTITION BY C1.OWNER,C1.TABLE_NAME) TABLE_HAS_FK
             FROM  DBA_CONSTRAINTS C1,
                   DBA_CONSTRAINTS C2
             WHERE C1.CONSTRAINT_TYPE IN ('P','U','R')
               AND C2.OWNER(+) = C1.R_OWNER
               AND C2.CONSTRAINT_NAME(+) = C1.R_CONSTRAINT_NAME
               AND C1.OWNER = 'SCOTT'
               AND C1.TABLE_NAME IN ('PARENT','CHILD','GRANDCHILD')
          )
SELECT  LEVEL,
        OWNER,
        TABLE_NAME
  FROM  T
  START WITH CONSTRAINT_TYPE IN ('P','U')
         AND TABLE_HAS_FK = 0
  CONNECT BY PARENT_OWNER = PRIOR OWNER
         AND PARENT_TABLE_NAME = PRIOR TABLE_NAME
         AND CONSTRAINT_TYPE = 'R'
/

 LEVEL OWNER     TABLE_NAME
------ --------- ----------
     1 SCOTT     PARENT
     2 SCOTT     CHILD
     3 SCOTT     GRANDCHILD

我使用了相同的查询,但我使用了表名 --(父、子、孙)

(从 configuration_table 中选择 t_name 其中 is_active =1)根据具有 90 个表的要求。

但是当我使用最上面的长查询时,它给了我 911 个表记录。你能告诉我原因吗?

0 个答案:

没有答案