Oracle:查找子记录表的名称和/或数量的简便方法

时间:2016-07-15 14:52:33

标签: oracle count parent-child

这不是一个真正的问题,因为这对我有用,但是有更简单,更直接的方法来获取任何给定表的子记录数吗?或者获取这些子记录的列表?这就是我正在做的事情(显然这将是动态的并且在游标循环中):

SELECT COUNT(*) as number-of-child-records
  FROM ALL_CONSTRAINTS
 WHERE     CONSTRAINT_NAME LIKE '%SOMETABLENAME%'
       AND SUBSTR (CONSTRAINT_NAME, 1, 4) = 'FK1_'
       AND TABLE_NAME <> 'SOMETABLENAME';

SELECT TABLE_NAME
  FROM ALL_CONSTRAINTS
 WHERE     CONSTRAINT_NAME LIKE '%SOMETABLENAME%'
       AND SUBSTR (CONSTRAINT_NAME, 1, 4) = 'FK1_'
       AND TABLE_NAME <> 'SOMETABLENAME';

仅供参考:为什么我这样做:

ORACLE有很多ALL_whatever表信息表,但没有一个直接简单地列出父记录或子记录。

我有一个自动程序需要更改一个或多个表中的键值 - 具体取决于它找到的内容。它转储到临时表,更改其中的值,删除实际表条目中的条目,然后从临时表中插入记录,然后从临时表中删除记录。

键值可能存在于具有父子关系的记录中。所以我需要首先处理删除时的子记录,然后首先处理插入的父记录。当我遇到要处理的新表时,我一直在记法表中记录每个表的子记录数。因此,要删除的光标(临时)按子编号ASC排序,然后DESC插回。

1 个答案:

答案 0 :(得分:0)

创建自己的视图并针对它编写分层查询。确保包含所有表格(表格中的字段可能是在同一个表格中引用PK 的FK - 请参阅原始帖子下的评论)。在分层查询中,您需要在某处nocycle

不确定为什么要按名字而不是按类型识别外键;见下文。

您可以使用类似的内容来创建视图:

select a.constraint_name   as f_key,
       a.owner             as f_owner,
       a.table_name        as f_table,
       a.r_constraint_name as p_key,
       a.r_owner           as p_owner,
       b.table_name        as p_table
from   all_constraints a inner join all_constraints b
                         on a.r_constraint_name = b.constraint_name
where  a.constraint_type = 'R';

以下是我数据库输出的一部分。 (我作弊,我是针对user_constraints运行的 - 我的架构名称是INTRO)。

F_KEY              F_OWNER    F_TABLE         P_KEY           P_OWNER    P_TABLE
------------------ ---------- --------------- --------------- ---------- ------------
REG_COURSEDATE_FK  INTRO      REGISTRATIONS   OFFERINGS_PK    INTRO      OFFERINGS
OFF_COURSE_FK      INTRO      OFFERINGS       COURSES_PK      INTRO      COURSES
EMP_DEP_FK         INTRO      EMPLOYEES       DEPARTMENTS_PK  INTRO      DEPARTMENTS
HIST_DEP_FK        INTRO      HISTORY         DEPARTMENTS_PK  INTRO      DEPARTMENTS
OFF_TRAINER_FK     INTRO      OFFERINGS       EMPLOYEES_PK    INTRO      EMPLOYEES
EMP_MGR_FK         INTRO      EMPLOYEES       EMPLOYEES_PK    INTRO      EMPLOYEES
REG_ATT_FK         INTRO      REGISTRATIONS   EMPLOYEES_PK    INTRO      EMPLOYEES
HIST_EMP_FK        INTRO      HISTORY         EMPLOYEES_PK    INTRO      EMPLOYEES
DEP_MGR_FK         INTRO      DEPARTMENTS     EMPLOYEES_PK    INTRO      EMPLOYEES

注意EMP_MGR_FK外键,它指向同一个表。

示例

假设您创建了此视图并将其命名为related_columns。然后您可以运行如下查询:

select *
from   related_columns
start with f_table = 'EMPLOYEES'
connect by nocycle prior p_key = f_key;


F_KEY              F_OWNER    F_TABLE         P_KEY           P_OWNER    P_TABLE
------------------ ---------- --------------- --------------- ---------- ------------
EMP_DEP_FK         INTRO      EMPLOYEES       DEPARTMENTS_PK  INTRO      DEPARTMENTS
EMP_MGR_FK         INTRO      EMPLOYEES       EMPLOYEES_PK    INTRO      EMPLOYEES