如何按照FK依賴關係的順序對最不依賴表的表進行排序?按照FK參考的順序對錶格進行排序?
例如,表A
具有FK參考B
,其具有FK參考號C
。結果應該是
C B A
select * from sys.tables order by .....?
如何按照FK依賴關係的順序對最不依賴表的表進行排序?按照FK參考的順序對錶格進行排序?
例如,表A
具有FK參考B
,其具有FK參考號C
。結果應該是
C B A
select * from sys.tables order by .....?
嘗試......
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
在一般情況下,你可以有循環依賴的多個圖形。我不會嘗試在SQL中執行此操作。這是一個相當困難的問題。
1)從sys.tables中提取所有父 - 子表對,並製作所有依賴項的簡單長列表。
2)使用類似http://www.graphviz.org/中的「點」來處理這些對並生成一個圖。
我個人使用這種方法來顯示存儲在我的數據庫中的銷售人員之間的依賴關係圖。
出於好奇,我做了我的數據庫中的所有外鍵。這裏的每個節點都是一個表格。
你不能看到這張截圖的所有細節,但它足以讓這個想法。現在我可以輕鬆找到位於依賴鏈頂部和底部的表(它們位於圖的最左側和最右側的列中)。
我用這個查詢:在一個文本文件keys.txt
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
認沽結果,該文本文件的第一行是:
digraph G { rankdir=LR
文本文件的
最後一行是
}
命令行生成圖:
"C:\Program Files (x86)\Graphviz2.38\bin\dot.exe" -okeys_graph_20150117.png -Tpng keys.txt
計數可能不是很好 - 例如,如果C只被B引用,但A和B被很多表引用,則C不會位於B的前面。 – ca9163d9
你試過了嗎?我在sys.foreign_keys上使用了LEFT連接,這意味着C不必被任何東西引用,而C的COUNT(DISTINCT b.name)將返回0,而A和B的COUNT(DISTINCT b.name)將返回1.我在我的數據庫上運行它,結果看起來正確嗎? – Spock