2

再帰的な 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サーバー2005です。

4

3 に答える 3

3

あなたが投稿したものには3つの問題があります:

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%ではありません。

于 2010-01-09T06:29:49.067 に答える
2

OwnerHierarchyCTE の後半のどこかで再帰的である必要があります。代わりに、あなたはBusinessHierarchy2回持っています。

于 2010-01-08T20:20:00.883 に答える
1

正確な要件を推測するだけですが、このようなものです。

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
于 2010-01-08T20:22:12.657 に答える