2016-10-25 19 views
0

给定一个带有外键的表,假设外键引用的表本身有外键,等等。我有兴趣弄清楚如何计算总外键关系的数量,特别是确定在外键方面,从起始表到最远的表最长的'路径'。如何在SQL Server的表中找到外键关系的“深度”?

例如,如果表BaseTable有两个外键,一个是TableA,另一个是TableB,则共有2个FK关系,最长路径共享两次。

如果表A则有一个FK参考表C,然后会有一共有3个FK关系,最长路径将是2,从底部到C.

+0

如果存在循环依赖性会怎么样? – RBarryYoung

+0

我只是在考虑非循环结构,但这是一个值得思考的问题。 对于循环依赖关系,可以“剪掉”使外围结构为循环的最小数量的外键关系,同时将最长路径缩短最短路径。 假设3个表格,T1,T2,T3。 T1具有指向T2的FK,T2具有指向T3的FK,并且T3具有指向T1的FK。 如果从T3删除单个FK到T1或从T1到T2(但不是两个)删除单个FK,则最长路径(= 2)保持不变。 – user2192320

回答

0

我想你想递归查询,将主键链接到外键。参见:Recursive Queries Using Common Table Expressions

获得“最遥远的距离”,你可以定义联合查询的运行总和列,就像这样:

WITH MyCTE AS (
SELECT Field1, Field2, ..., 0 AS Level 
FROM tblRelationships 
... 
UNION ALL 
SELECT Field1, Field2, ..., Level + 1 AS Level 
FROM tblRelationships R INNER JOIN 
    MyCTE M ON R.PK = M.FK 
... 
) 

你可以从MyCTE具有等级,然后选择=最大级别的所有行返回由CTE。要计算外键关系,只需从MyCTE进行计数。

确保在两种情况下都过滤tablename = anchor定义中的基表。

+0

这是一个非常优雅的建议;我会试一试。谢谢你,先生。 – user2192320

0

运行此:sp_msdependencies看看结果,其中oType = 8.不能与SQL Azure的头脑,你的工作,但应该工作,如果你使用的是2008年

我用这个刚刚弄清楚顺序用于加载数据的操作。