Учитывая SourceTable и TargetTable, я хотел бы программно создать строку со всеми необходимыми объединениями.
Короче говоря, я пытаюсь найти способ создать строку, как это:
FROM SourceTable t
JOIN IntermediateTable t1 on t1.keycolumn = t.keycolumn
JOIN TargetTable t2 on t2.keycolumn = t1.keycolumn
У меня есть запрос, который возвращает все внешние ключи для данной таблицы, но я сталкиваюсь с ограничениями в попытке рекурсивно пройти через все это, чтобы найти оптимальный путь соединения и создать строку.
SELECT
p.name AS ParentTable
,pc.name AS ParentColumn
,r.name AS ChildTable
,rc.name AS ChildColumn
FROM sys.foreign_key_columns fk
JOIN sys.columns pc ON pc.object_id = fk.parent_object_id AND pc.column_id = fk.parent_column_id
JOIN sys.columns rc ON rc.object_id = fk.referenced_object_id AND rc.column_id = fk.referenced_column_id
JOIN sys.tables p ON p.object_id = fk.parent_object_id
JOIN sys.tables r ON r.object_id = fk.referenced_object_id
WHERE fk.parent_object_id = OBJECT_ID('aTable')
ORDER BY ChildTable, fk.referenced_column_id
Я уверен, что это было сделано раньше, но я не могу найти пример.
OrderItems
сOrders
и обратно сOrderItems
.Ответы:
У меня был скрипт, который делает элементарную версию обхода внешнего ключа. Я быстро адаптировал его (см. Ниже), и вы можете использовать его в качестве отправной точки.
Для заданной таблицы сценарий пытается напечатать строку соединения для кратчайшего пути (или одного из них в случае связей) для всех возможных исходных таблиц, так что внешние столбцы одного столбца могут быть пройдены для достижения целевой таблицы. Сценарий, кажется, хорошо работает с базой данных с несколькими тысячами таблиц и многими соединениями FK, на которых я его пробовал.
Как другие упоминают в комментариях, вам нужно сделать это более сложным, если вам нужно обрабатывать внешние столбцы с несколькими столбцами. Также имейте в виду, что это ни в коем случае не готовый к использованию полностью протестированный код. Надеюсь, это полезная отправная точка, если вы решите использовать эту функциональность!
источник
Вы можете поместить список ключей таблицы с двумя полями TAB_NAME, KEY_NAME для всех таблиц, которые вы хотите соединить.
Пример для таблицы
City
Точно так же
Province
иCountry
.Соберите данные для таблиц и поместите в одну таблицу (например, таблица метаданных)
Теперь составьте запрос, как показано ниже
Это поможет вам связать таблицы на основе соответствующих ключей (с одинаковыми именами ключей).
Если вы считаете, что имя ключа может не совпадать, вы можете включить поле альтернативного ключа и попытаться использовать его в условии where.
источник
sys
таблицы в SQL Server, которые описывают столбцы в таблице, как таблицы связаны друг с другом и т. Д. Все это уже существует. Создание ваших собственных таблиц, которые определяют структуру вашей таблицы для удовлетворения конкретной потребности, может быть запасной позицией, но предпочтительный ответ будет использовать то, что уже существует, как и принятый ответ .