2010-05-19 5 views
1

retour j'ai une requête hiérarchique typique SQL Server:hiérarchique requête SQL non de niveau

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 

Cela semble correspondre aux différents exemples de requêtes hiérarchiques que j'ai trouvé sur le web, mais pour une raison quelconque, il est producting cette erreur:

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

Je suis sûr que je manque quelque chose d'évident, mais je l'ai regardé trop longtemps pour le voir. Une idée d'où je vais mal?

Répondre

1

Dans la section récursive de l'ECU, l'une des tables auxquelles vous faites référence devrait être l'ECU elle-même, n'est-ce pas? Pour le moment, vous vous joignez simplement à BhpNode et il n'y a pas de colonne level elle-même.

+0

BINGO! La référence à la CTE dans la section récursive n'était pas évidente dans les exemples que je regardais et s'est perdue en traduisant à mes tables. Je savais que c'était mal de référencer le niveau sans le définir, et maintenant je sais pourquoi. Merci pour la réponse rapide. – gfrizzle

3

Votre requête n'est pas récursive - vous devez sélectionner bhp dans la deuxième partie du CTE récursif. Essayez ceci à la place:

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