#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
Я использовал тот же запрос, но вместо этого для имен таблиц —(родитель, ребенок, внук) Я взял
(выберите t_name из таблицы конфигураций, где is_active =1) в соответствии с требованием, содержащим 90 таблиц.
Но когда я использую самый верхний длинный запрос, он выдает мне 911 записей таблицы. Не могли бы вы, пожалуйста, объяснить мне причину?
Комментарии:
1. Примеры таблиц и данных очень помогли бы.