查找使用公共列的所有表的列表

时间:2014-10-28 09:59:16

标签: sql database oracle10g

我有一个要求,我需要找出所有具有共同列的表。


我的要求是下面的例子:
学校教师被分配到许多部门的许多任务。每个分区都保存为一个表。因此,所有分区表都应该有一个可以指向教师ID的列。但是列的名称可能不同。例如:DivA-TeacherId,DivB-TeacherId ....,DivN-TeacherId


还有一个名为教师的表格,其中包含教师的详细信息
表教师 - 列TeacherId(主键)

老师离开学校,一位新老师取代了他,并担任老教师的同样角色和责任。 所以在这里我们需要用新老师更新所有的依赖表。

我们可能有100个表。因此很难手动找到所有这些表。

是否有查询,我们可以找到所有那些依赖于此列的表,以便可以使用新的TeacherId更新这些表。(请注意,此列的命名在所有依赖表中可能不相同。但是所有这些列名可能都有一个共同的子串“TeacherId”)

请建议是否可以使用任何查询来查找上述解决方案。

3 个答案:

答案 0 :(得分:2)

让我们用一个例子来理解它。

SQL> SELECT a.owner,
  2    a.table_name,
  3    b.owner primary_owner,
  4    b.table_name primary_table
  5  FROM user_constraints a,
  6    user_constraints b
  7  WHERE a.table_name      = 'EMP'
  8  AND a.r_constraint_name = b.constraint_name
  9  /

OWNER      TABLE_NAME PRIMARY_OWNER   PRIMARY_TABLE
---------- ---------- --------------- ---------------
SCOTT      EMP        SCOTT           DEPT

SQL>

以上查询使用referential integrity。表DEPT引用表EMPcolumn names与表引用无关。

在您的情况下,将EMP替换为您的表名。查询将列出引用您表格的所有表格。

您可以阅读*_CONSTRAINTS

的文档

答案 1 :(得分:2)

select     uc.constraint_name fk_ref_to_source,
           ucc1.table_name table_ref_to_source,
           ucc1.column_name column_ref_to_source,
           ucc2.table_name source_table,
           ucc2.column_name source_column
    FROM   user_constraints uc, user_cons_columns ucc1, user_cons_columns ucc2
   WHERE       uc.constraint_name = ucc1.constraint_name
           AND uc.r_constraint_name = ucc2.constraint_name
           AND ucc1.position = ucc2.position -- Correction for multiple column primary keys.
           AND uc.constraint_type = 'R'
           AND ucc2.table_name = 'TEACHER'
ORDER BY   ucc1.table_name, uc.constraint_name;

user_constraints 包含有关用户约束的信息 user_cons_columns 包含有关构成约束的列的信息

此查询将为您的案例生成更新:

SELECT     'update ' || ucc1.table_name || ' set ' || ucc1.column_name || ' = newTeacherId ' || ' where ' || ucc1.column_name || ' oldTeacherId;' sql
    FROM   user_constraints uc, user_cons_columns ucc1, user_cons_columns ucc2
   WHERE       uc.constraint_name = ucc1.constraint_name
           AND uc.r_constraint_name = ucc2.constraint_name
           AND ucc1.position = ucc2.position -- Correction for multiple column primary keys.
           AND uc.constraint_type = 'R'
           AND ucc2.table_name = 'TEACHER'
           AND ucc2.column_name = 'TEACHERID';

答案 2 :(得分:1)

您可以使用系统表ALL_TAB_COLUMNS

select * from all_tab_columns
    where column_name LIKE '%Teacher%'