按FK引用的顺序对表进行排序?

时间:2015-01-16 21:23:25

标签: sql-server sql-server-2008

如何按照FK依赖关系的顺序对表列表进行排序,并在顶部依赖最少的表?

例如,表A具有FK引用B,其具有FK引用C。结果应该是

    C
    B
    A
select * from sys.tables order by .....?

2 个答案:

答案 0 :(得分:1)

试试这个......

select a.Name
from sys.tables a
    LEFT JOIN sys.foreign_keys b ON a.object_id = b.parent_object_id
GROUP BY a.Name
ORDER BY COUNT(DISTINCT b.name) ASC

答案 1 :(得分:1)

在一般情况下,您可以使用循环来生成多个依赖关系图。我不会尝试在SQL中执行此操作。这是一个相当困难的问题。

1)从sys.tables中提取所有父子表对,并生成所有依赖项的简单长列表。

2)使用http://www.graphviz.org/中的“点”之类的东西来处理这些对并生成图表。

我个人使用这种方法来可视化存储在我的数据库中的销售人员之间的依赖关系图。

出于好奇,我为数据库中的所有外键都做了。这里的每个节点都是一个表。

keys

您无法看到此屏幕截图的所有详细信息,但这足以说明这一点。我现在可以轻松找到位于依赖关系链顶部和底部的表(它们位于图表的最左侧和最右侧列中)。

我使用了这个查询:

select 
    '"'+ParentTables.name+'" -> "'+ReferencedTables.name+'";' AS dot
from
    sys.foreign_keys
    inner join sys.tables AS ParentTables ON ParentTables.object_id = sys.foreign_keys.parent_object_id
    inner join sys.tables AS ReferencedTables ON ReferencedTables.object_id = sys.foreign_keys.referenced_object_id

将结果放入文本文件keys.txt中,文本文件的第一行是:

digraph G { rankdir=LR

文本文件的最后一行是

}

生成图表的命令行:

"C:\Program Files (x86)\Graphviz2.38\bin\dot.exe" -okeys_graph_20150117.png -Tpng keys.txt