如何在大型数据库中查找从一个表到另一个表的连接路径

Tan*_*son 2 sql t-sql database sql-server-2008

是否有一种简单的方法(或工具)可以在大型数据库中查找从一个表到另一个表的连接路径?

我目前正在开发一个项目,其数据库有超过150个表.下面是我正在尝试做的一些用例.

使用案例:

输入

  • 选择表A.
  • 选择表B.

产量

  • 打印出表之间的所有可用路径.
  • 打印出最有效的路线.

Ann*_* L. 5

由于我假设您在数据库中有一些非常复杂的路径,因此您无法仅使用一个查询甚至几个查询来执行此操作.我已经完成了(我继承了一个项目),并学到了一些有趣的东西.但我不得不写一个程序来做.

我所做的是在他的答案中使用模式视图迭代引用,并应用一些方法来解决图论问题(因为这基本上是你所拥有的,这里,表是节点和图中的外键链接.)

基本上,如果我没记错(这是几年前),你从一个表开始,然后通过将每个引用的另一个表的名称放入队列来处理它的所有外键.检查自引用和循环(您需要一个哈希集或已处理的表的列表.)然后从队列中弹出下一个表并重复.最终,您将遇到另一个表,或者处理了您可以从原始表中"到达"的每个表.


Die*_*ego 4

这应该对你有帮助。它将显示您的表、具有 FK 的列、引用的表和列以及 FK 名称。

SELECT
K_Table = FK.TABLE_NAME,
FK_Column = CU.COLUMN_NAME,
PK_Table = PK.TABLE_NAME,
PK_Column = PT.COLUMN_NAME,
Constraint_Name = C.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (
SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT ON PT.TABLE_NAME = PK.TABLE_NAME
Run Code Online (Sandbox Code Playgroud)