查询以获取父表,然后在数据库模式中获取子表

时间:2015-09-18 11:25:54

标签: database oracle

我正在使用JDBC连接编写dbExporter,它将数据从一个数据库导出到另一个数据库。为此,我需要导出哪些表,我使用查询获取所有表名

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

但问题在于它们的获取顺序,

场景:(ORDER_DETAILS具有来自ORDERS的外键)。 假设上述查询的结果将导致ORDER_DETAILS,ORDERS。我会先尝试导出ORDER_DETAILS的数据,然后再导出ORDERS。此步骤抛出异常,因为ORDER_DETAILS与ORDERS具有外键关系。因此我需要先导出ORDERS表。

我应该如何确保上述查询的结果首先获取父表,然后获取其子表。是否有一种直接来自查询的方法,它将按顺序返回表格。

1 个答案:

答案 0 :(得分:1)

您可以在此处使用系统视图user_constraintsuser_cons_columns, 下一个构建分层查询,显示表之间的依赖关系并将其连接到user_tables

with hierarchy as (
  select child_table, max(level) lvl 
    from (
      select uc.table_name child_table, ucc.table_name parent_table
        from user_constraints uc
        left join user_cons_columns ucc on ucc.constraint_name = uc.r_constraint_name
        where constraint_type = 'R')
    connect by parent_table = prior child_table
    group by child_table)
select u.table_name, h.lvl 
  from user_tables u left join hierarchy h on h.child_table = u.table_name
  order by lvl nulls first, u.table_name

输出和SQLFiddle demo

TABLE_NAME                            LVL
------------------------------ ----------
ORDERS                         
TEST_TABLE                     
ORDER_DETAILS                           1
ORDER_SUB_DETAILS                       2

首先,您必须导出具有可空LVL的表,按此列依次休息。 我不确定这是否能解决所有可能的依赖性或更复杂的情况,但是对于给定的例子是有效的。