我有一个要求,我需要找出所有具有共同列的表。
我的要求是下面的例子:
学校教师被分配到许多部门的许多任务。每个分区都保存为一个表。因此,所有分区表都应该有一个可以指向教师ID的列。但是列的名称可能不同。例如:DivA-TeacherId,DivB-TeacherId ....,DivN-TeacherId
还有一个名为教师的表格,其中包含教师的详细信息
表教师 - 列TeacherId(主键)
老师离开学校,一位新老师取代了他,并担任老教师的同样角色和责任。 所以在这里我们需要用新老师更新所有的依赖表。
我们可能有100个表。因此很难手动找到所有这些表。
是否有查询,我们可以找到所有那些依赖于此列的表,以便可以使用新的TeacherId更新这些表。(请注意,此列的命名在所有依赖表中可能不相同。但是所有这些列名可能都有一个共同的子串“TeacherId”)
请建议是否可以使用任何查询来查找上述解决方案。
答案 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
引用表EMP
。 column 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%'