2013-11-03 27 views
0

我有這個疑問應該建立類別的分級通路的關係的SQL Server:與CTE工作造成錯誤

;with cte as 
(

    select 
     CAST(1 as int) as RelationID, 
     1 CategoryID, 
     c.Name Name 
     ,CAST(('') as varchar(1000)) as Indent,CAST(c.Name as varchar(1000)) as Pathway,0 as Level 
    from 
     Categories c 
    where 
     c.ID = 1 

    union all 

    select 
     relation.RelationID, 
     relation.CategoryID, 
     c.Name Name 
     ,CAST(('|— ' + cte.Indent) as varchar(1000)) as Indent,CAST((cte.Pathway + '/' + c.Name) as varchar(1000)) as Pathway,cte.Level + 1 as Level 
    from 
     Category_Relations relation 
    inner join 
     Categories c on c.Id = relation.CategoryID 
    inner join cte on cte.RelationID = relation.RelationID 
    where c.ID > 1 
) 
select * from cte 

現在我不知道爲什麼它會無限!

我有兩個表是這樣的:

Categories: 
ID,Name 
1,Main 
2,Cat1 
3,Cat2 
4,Cat3 
5,Cat4 
6,Cat1.1 
7,Cat1.2 
8,Cat2.1 
9,Cat3.1 

Category_Relations: 
ID,RelationID,CategoryID 
1,0,1 (main cat) 
2,1,2 
3,1,3 
4,1,4 
5,1,5 
6,2,6 
7,2,7 
8,3,8 
9,4,9 

Idealy的SQL應該建立途徑:

main 
main/cat1 
main/cat2 
main/cat3 
main/cat4 
main/cat1/cat1.1 
main/cat1/cat1.2 
main/cat2/cat2.1 
main/cat3/cat3.1 

但它會無限的,並給予遞歸的錯誤,任何幫助,對此?

+1

看看[這裏](http://stackoverflow.com/questions/15080922/infinite-loop-cte-with-option-maxrecursion-0/15081353#15081353)檢測數據中循環的技術。查詢中一個不尋常的地方是'RelationshipId'永遠不會改變,並且是遞歸部分中返回CTE的唯一條件。嘗試在遞歸部分添加'Level Level <3'來限制遞歸併得到結果。 – HABO

+0

@HABO,它怎麼沒變?我在查詢的末尾有cte.RelationID = relation.RelationID的內部連接cte。 – KMX

+1

我的不好。我沒有正確跟蹤'RelationId'上的別名。請嘗試使用「Level」上的限制來查看發生了什麼。 – HABO

回答

0

我才意識到我是做了一個錯誤,

,如果你仔細觀察一下以下行,然後總會有錯誤:

select 
    relation.RelationID 

的問題是,RelationID不會改變(感謝哈勃),所以我不得不調整一下,並用relation.ID代替relation.RelationID,因爲它總是必須是唯一的。

問題解決!