Как найти все ссылки из других таблиц на конкретную строку? - PullRequest
0 голосов
/ 17 февраля 2009

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

Что мне интересно, так это то, что если у меня есть конкретная строка в таблице адресов, есть ли способ узнать, какая строка в какой таблице указывает на нее. Так что в основном только это:

SELECT * FROM schools WHERE address_id = 1

Но это означало бы, что я должен знать, что адрес в строке 1 связан со школой. Но что, если я этого не знаю? Это может быть 1 из 10 других таблиц ...

Ответы [ 2 ]

5 голосов
/ 17 февраля 2009

Вам нужно будет запросить все остальные таблицы.

Я бы сделал это как запрос UNION:

  SELECT id, "schools" as whichTable from schools where address_id=1
  UNION
  SELECT id, "parks" as whichTable from parks where address_id=1
  UNION
  ...

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

Если у вас есть список таблиц (или таблица таблиц), вы можете сгенерировать запрос программным способом - это избавит вас от необходимости обновлять запрос при изменении таблиц.

2 голосов
/ 17 февраля 2009

То, что вы ищете - при условии, что у вас есть СУБД, соответствующая ISO - это набор таблиц INFORMATION_SCHEMA (на самом деле viewset, но эй).

Вы можете найти зависимые таблицы, например, так:

select 
    cons.CONSTRAINT_NAME 'ConstraintName',
    keys.TABLE_NAME 'PKTable',
    keys.COLUMN_NAME 'PKColumn',
    cols.TABLE_NAME 'FKTable',
    cols.COLUMN_NAME 'FKColumn'
from INFORMATION_SCHEMA.REFERENTI cons
join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cols on cols.CONSTRAINT_NAME = cons.CONSTRAINT_NAME
join INFORMATION_SCHEMA.KEY_COLUMN_USAGE keys on keys.CONSTRAINT_NAME = cons.UNIQUE_CONSTRAINT_NAME

ПРИМЕЧАНИЕ: Это очень грубый, непроверенный запрос. Вы поняли, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...