【问题标题】:how to get informations about relationship of tables in oracle?oracle中如何获取表的关系信息?
【发布时间】:2014-01-20 10:36:57
【问题描述】:

我需要获取以下格式的表关系信息:

source_table    source_pk    source_fk    destination_table    destination_pk
............    .........    .........    .................    ..............

 employees     employee_id    job_id            jobs               job_id

它说主键为“employee_id”和外键为“job_id”的表“employees”指的是主键为“job_id”的表“jobs”。 有什么问题可以给我这些信息吗? 更新: 我想要一个用特定模式(如“hr”)的所有关系填充此表的查询。

【问题讨论】:

    标签: oracle foreign-key-relationship


    【解决方案1】:

    您可以根据您的访问级别查询任何 dba_constraints、all_constraints 或 user_constraints 视图,如下所示

    WITH tab AS (SELECT table_name, 
                        MIN(decode(constraint_type, 'P', constraint_name, NULL)) PRIMARY_KEY, 
                        MIN(decode(constraint_type, 'R', constraint_name, NULL)) FOREIGN_KEY,
                        MIN(decode(constraint_type, 'R', r_constraint_name, NULL)) DESTINATION_PK
                   FROM dba_Constraints
                  WHERE table_name = 'EMPLOYEE'
                  GROUP BY table_name)
    SELECT t.table_name, t.PRIMARY_KEY, t.FOREIGN_KEY, uc.table_name, t.DESTINATION_PK
      FROM tab t
      LEFT OUTER JOIN dba_Constraints uc 
        ON (uc.constraint_name = t.destination_pk);
    

    获取有关特定模式中所有表的信息(例如 HR):

    WITH tab AS (SELECT table_name, 
                        MIN(decode(constraint_type, 'P', constraint_name, NULL)) PRIMARY_KEY, 
                        MIN(decode(constraint_type, 'R', constraint_name, NULL)) FOREIGN_KEY,
                        MIN(decode(constraint_type, 'R', r_constraint_name, NULL)) DESTINATION_PK
                   FROM all_constraints
                  WHERE owner = 'HR'
                  GROUP BY table_name)
    SELECT t.table_name, t.PRIMARY_KEY, t.FOREIGN_KEY, uc.table_name, t.DESTINATION_PK
      FROM tab t
      LEFT OUTER JOIN all_constraints uc 
        ON (uc.constraint_name = t.destination_pk)
    ORDER BY 1;
    

    注意:如果表上没有主键,则不会返回任何行。

    【讨论】:

    • 我想要这个关于特定模式和表中所有关系的信息,员工只是一个例子。
    • 在这种情况下,用架构名称替换 WHERE table_name = 'EMPLOYEE'
    • 我在 hr 架构上尝试了此查询,但它回复“未选择任何行”。
    • 您需要修改查询模式名称,我已经更新了原帖。
    猜你喜欢
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    • 2011-07-21
    • 2021-12-23
    • 2014-05-24
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多