SQL-запрос рекурсивного CTE-запроса «неверное имя столбца - уровень» - PullRequest
2 голосов
/ 08 января 2010

Пытаясь написать рекурсивный запрос CTE, продолжайте получать следующую ошибку: level, invalid column name

Это запрос, где я ошибаюсь?

WITH OwnerHierarchy AS (
   SELECT PairID, 
          ChildID, 
          ParentID, 
          0 AS level
     FROM BusinessHierarchy
   UNION ALL
   SELECT e.PairID, 
          e.ChildID, 
          e.ParentID, 
          level + 1 AS level
     FROM BusinessHierarchy AS e 
     JOIN BusinessHierarchy AS eh ON e.ParentID = eh.ParentID)
 SELECT PairID, 
        ChildID, 
        ParentID, 
        level
    FROM OwnerHierarchy AS OwnerHierarchy_1
 ORDER BY level, ChildID, ParentID

Это MS SQL Server 2005.

Ответы [ 3 ]

3 голосов
/ 09 января 2010

Есть три проблемы с тем, что вы отправили:

WITH OwnerHierarchy AS (
   SELECT a.pairid, 
          a.childid, 
          a.parentid, 
          0 AS level
     FROM BusinessHierarchy a
    WHERE a.parentid IS NULL -- Point #1, see below
   UNION ALL
   SELECT b.PairID, 
          b.ChildID, 
          b.ParentID, 
          oh.level + 1 AS level
     FROM BusinessHierarchy AS b
     JOIN OwnerHierarchy oh ON oh.childid = b.parentid) -- Points #2 & 3, see below
 SELECT x.PairID, 
        x.ChildID, 
        x.ParentID, 
        x.level
    FROM OwnerHierarchy x
 ORDER BY x.level, x.ChildID, x.ParentID

Очки:

  1. В верхней части UNION отсутствует то, что определяет корневые узлы / записи / строки. Я предположил, надеюсь, правильно ...
  2. Вы присоединяли BusinessHierarchy к себе, когда ссылкой должно быть имя CTE
  3. Соотношение между CTE и исходной таблицей должно быть правильным и в правильном направлении

Реквизиты для использования псевдонимов таблиц, но они не использовались последовательно, и они должны быть максимально краткими. Вам не нужно использовать AS при их определении, просто вопрос стиля в этой части.

Заключение


Я думаю, псевдонимы таблиц будут иметь дело с тем, что столбец level не найден, но не на 100%.

2 голосов
/ 08 января 2010

Вам нужно OwnerHierarchy где-то во второй половине CTE, чтобы быть рекурсивным. Вместо этого у вас есть BusinessHierarchy дважды.

1 голос
/ 08 января 2010

Просто догадываюсь о точных требованиях, но как-то так.

WITH OwnerHierarchy(PairID, ChildID, ParentID, level)
AS 
(
     SELECT PairID, ChildID, ParentID, 0 AS level
     FROM BusinessHierarchy
     WHERE ParentID IS NULL
     UNION ALL
     SELECT e.PairID, e.ChildID, e.ParentID, level + 1 AS level
     FROM BusinessHierarchy AS e 
     INNER JOIN OwnerHierarchy AS eh 
     ON e.ParentID = eh. ChildID
     )
 SELECT     PairID, ChildID, ParentID, level
 FROM         OwnerHierarchy AS OwnerHierarchy_1
 ORDER BY level, ChildID, ParentID
...