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 个表记录。你能告诉我原因吗?