2010-07-12 24 views
4

我在Excel中有父子數據,該數據被加載到運行MS SQL服務器的第三方系統中。數據表示有向(有希望)非循環圖。第三方意味着我在架構中沒有完全放手。 excel數據是其他文件的串聯,並且存在以下可能性:在各個文件之間的交叉引用中,某人引起了循環 - 即X是Y(X> Y)的子節點,然後是別處(Y-> A- > BX)。我可以在excel或SQL服務器db上編寫vb,vba等。 excel文件差不多有3萬行,所以我擔心隨着數據量的增長,組合爆炸將會增加。因此,像創建所有路徑的表一樣的技術可能相當笨拙。我正在考慮簡單地編寫一個程序,該程序對每個根進行遍歷每個葉的樹,並且如果深度超過某個標稱值,則會對其進行標記。
更好的建議或指向以前的討論歡迎。SQL - 在父子關係中檢測循環

+0

當檢測到循環時,您想要做什麼? – Fosco 2010-07-12 16:17:50

+0

如果您不知道或無法確定最大有效深度,那麼您的「大於等級X =問題」的任意上限可能不準確。這些信息是否可用? – 2010-07-12 16:25:01

回答

4

您可以使用遞歸CTE檢測循環:

with prev as (
    select RowId, 1 AS GenerationsRemoved 
    from YourTable 
    union all 
    select RowId, prev.GenerationsRemoved + 1 
    from prev 
    inner join YourTable on prev.RowId = ParentRowId 
    and prev.GenerationsRemoved < 55 
) 
select * 
from prev 
where GenerationsRemoved > 50 

這並不需要你指定最大遞歸級別:在這種情況下,CTE運行至55,並與超過選擇爲錯誤的行50個孩子。

+0

這幾乎是我所做的。它運作良好。 – 2010-07-12 16:29:56

+0

我從來沒有聽說過CTE,因爲我的數據庫經驗主要是zSeries DB/2。謝謝你指向他們的指針。我想我現在有一些其他問題的答案。 – Wudang 2010-07-13 08:56:21

+1

並在這裏找到了一個體面的教程 http://msdn.microsoft.com/en-us/library/ms186243.aspx 謝謝你們 – Wudang 2010-07-13 10:20:18