2010-05-19 101 views
1
水平

我有一個典型的SQL Server分級查詢:分層SQL查詢沒有返回

WITH bhp AS (
    SELECT name, 0 AS level 
    FROM dbo.BhpNode 
    WHERE parent_id IS NULL 
    UNION ALL 
    SELECT a.name, level + 1 
    FROM dbo.BhpNode a 
    INNER JOIN dbo.BhpNode b 
     ON b.bhp_node_id = a.parent_id) 
    SELECT * FROM bhp 

這似乎符合我的網絡上發現的分層查詢的各種例子,但由於某種原因它的產區這個錯誤:

Msg 207, Level 16, State 1, Line 12
Invalid column name 'level'.

我確定我錯過了一些明顯的東西,但我盯着它看了太久。任何想法,我要去哪裏錯了?

回答

1

在CTE的遞歸部分中,您引用的其中一個表格應該是CTE本身,不是嗎?目前,您只是自己加入BhpNode,並且它本身沒有level列。

+0

賓果!遞歸部分對CTE的引用在我看到的例子中並不明顯,在翻譯到我的表格時丟失了。我知道在沒有定義它的情況下引用級別感覺不對,現在我知道爲什麼。感謝您及時的回覆。 – gfrizzle 2010-05-19 20:55:48

3

您的查詢不是遞歸的 - 您必須從遞歸CTE的第二部分中的bhp中進行選擇。試試這個:

WITH bhp AS (
    SELECT *, 0 AS [level] 
    FROM dbo.BhpNode 
    WHERE parent_id IS NULL 
    UNION ALL 
    SELECT b.*, [level] + 1 
    FROM bhp a 
    INNER JOIN dbo.BhpNode b 
    ON a.bhp_node_id = b.parent_id) 
SELECT * FROM bhp