Вы можете присоединить связанные с ограничениями словаря данных представления к себе и друг к другу, чтобы найти оба конца любых ссылочных ограничений.
Немного грубовато, но что-то вроде:
select uc1.constraint_name, uc1.table_name, ucc1.column_name,
uc2.constraint_name, uc2.table_name, ucc2.column_name
from user_constraints uc1
join user_cons_columns ucc1 on ucc1.constraint_name = uc1.constraint_name
join user_constraints uc2 on uc2.constraint_name = uc1.r_constraint_name
join user_cons_columns ucc2 on ucc2.constraint_name = uc2.constraint_name
and ucc2.position = ucc1.position
where uc1.table_name in (<table1>, <table2>)
and uc1.constraint_type = 'R'
and uc2.table_name in (<table1>, <table2>)
and uc2.constraint_type in ('P', 'U');
IПредполагается, что у вас могут быть составные ключи, и вы не знаете, каким будет отношение между двумя таблицами, поэтому ищите любое имя в обоих фильтрах в предложении here
.Я также немного упростил использование user_tables
и даже тогда игнорировал столбец owner
- если ссылки охватывают схемы, вы можете включить их и использовать таблицы all_*
вместо user_*
.
Быстрое демо:
create table t1 (
id number,
uniq1 number,
uniq2 number,
constraint t1_pk primary key (id),
constraint t1_uk unique (uniq1, uniq2)
);
create table t2 (
id number,
t1_id number,
t1_uniq1 number,
t1_uniq2 number,
constraint t2_fk_1 foreign key (t1_id) references t1 (id),
constraint t2_fk_2 foreign key (t1_uniq1, t1_uniq2) references t1 (uniq1, uniq2)
);
select uc1.constraint_name as foreign_key,
uc1.table_name as child_table,
ucc1.column_name as child_column,
ucc1.position,
uc2.constraint_name as pri_or_uniq_key,
uc2.table_name as parent_table,
ucc2.column_name as parent_column
from user_constraints uc1
join user_cons_columns ucc1 on ucc1.constraint_name = uc1.constraint_name
join user_constraints uc2 on uc2.constraint_name = uc1.r_constraint_name
join user_cons_columns ucc2 on ucc2.constraint_name = uc2.constraint_name
and ucc2.position = ucc1.position
where uc1.table_name in ('T1', 'T2')
and uc1.constraint_type = 'R'
and uc2.table_name in ('T1', 'T2')
and uc2.constraint_type in ('P', 'U')
order by foreign_key, position;
FOREIGN_KEY CHILD_TABLE CHILD_COLUMN POSITION PRI_OR_UNIQ_KEY PARENT_TABLE PARENT_COLUMN
----------- ----------- ------------ -------- --------------- ------------ -------------
T2_FK_1 T2 T1_ID 1 T1_PK T1 ID
T2_FK_2 T2 T1_UNIQ1 1 T1_UK T1 UNIQ1
T2_FK_2 T2 T1_UNIQ2 2 T1_UK T1 UNIQ2