Как найти конкретные ссылки между двумя таблицами - PullRequest
0 голосов
/ 07 декабря 2018

У меня много таблиц и много связей между ними.Когда я пытаюсь соединить их между собой, я застреваю в поиске связи между двумя таблицами.

Ради простоты, скажем, у меня есть Таблица A и Таблица B .Они связаны с внешним ключом.

В: Как я могу найти внешний ключ между этими двумя точными таблицами и столбцом, на который он ссылается?И не все таблицы или внешние ключи, которые имеют ссылку на эту таблицу.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Хотя важно знать, где найти такую ​​информацию, инструмент с графическим интерфейсом очень поможет.

Больше всего помогает инструмент с графическим интерфейсом, способный создавать ER-диаграмму .Вы должны выбрать таблицы и позволить этому инструменту создать его.Тогда перед вами будет схема со всеми таблицами в виде прямоугольников и связей между ними в виде линий.

Верно - если таблиц много, диаграмма будет большой, для ее создания потребуется время, и, вероятно, ее будет непросто прочитать, поскольку таблицы не будут размещены в одной таблице.рядом с другим (в зависимости от отношений между ними).Но, если вы достаточно терпеливы, вы измените это и получите от этого пользу.

0 голосов
/ 07 декабря 2018

Вы можете присоединить связанные с ограничениями словаря данных представления к себе и друг к другу, чтобы найти оба конца любых ссылочных ограничений.

Немного грубовато, но что-то вроде:

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           
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...