0

そのようなテーブルがあるとしましょう(SQL SERVER 2005)

pairID childID parentID
 0       1      2
 1       2      3
 2       3      4

そして、このデータセットを返す CTE があります。

pairID childID parentID level
 0       1      2        2
 1       2      3        1
 2       3      4        0

代わりにこの結果セットを取得できるように、最初の子 ID を保存するにはどうすればよいですか。

pairID childID parentID level
 0       1      2        2
 1       1      3        1
 2       1      4        0

基本的に私がやっていることは、元の子IDを保持し、他の代わりにそれを返すことです...

これはこれまでの CTE クエリで、完全に機能します。

WITH TESTER AS (SELECT a.PairID,
                a.ChildID,
                a.ParentID,
                0 AS Level
                FROM
                BusinessHierarchy AS a 
                LEFT OUTER JOIN BusinessHierarchy AS a2 
                ON a.ParentID = a2.ChildID
                WHERE (a2.PairID IS NULL)
                UNION ALL
                SELECT b.PairID, b.ChildID, b.ParentID, oh.Level + 1 AS Level
                FROM BusinessHierarchy AS b INNER JOIN
                TESTER AS oh ON b.ParentID = oh.ChildID)
SELECT PairID, ChildID, ParentID, Level
 FROM  TESTER AS x
 ORDER BY Level, ChildID, ParentID
4

3 に答える 3

0

テストされていませんが、これを試しましたか?

;WITH My_CTE AS
(
     SELECT
          BH1.PairID,
          BH1.ChildID AS BaseID,
          BH1.ChildID,
          BH1.ParentID,
          0 AS Level
     FROM
          BussinessHierarchy BH1
     LEFT OUTER JOIN BussinessHierarchy BH2 ON
          BH1.ParentID = BH2.ChildID
     WHERE
          BH2.PairID IS NULL
     UNION ALL
     SELECT
          BH3.PairID,
          CTE.BaseID,
          BH3.ChildID,
          BH3.ParentID,
          CTE.Level + 1 AS Level
     FROM
          My_CTE CTE
     INNER JOIN BussinessHierarchy BH3 ON
          BH3.ParentID = CTE.ChildID
     )
SELECT
     PairID,
     BaseID,
     ParentID,
     Level
FROM
     My_CTE
ORDER BY
     Level,
     BaseID,
     ParentID
于 2010-01-12T01:50:55.830 に答える
0

最初に(変数に)それを取得してから、後でその変数を使用できます。

DECLARE @StartingId int

SELECT
    @StartingId = a.PairID
FROM BusinessHierarchy AS a 
LEFT OUTER JOIN BusinessHierarchy AS a2 ON a.ParentID = a2.ChildID
WHERE (a2.PairID IS NULL)


WITH TESTER AS (SELECT a.PairID,
            a.ChildID,
            a.ParentID,
            0 AS Level
            FROM
            BusinessHierarchy AS a 
            WHERE (a.PairID = @StartingId)
            UNION ALL
            SELECT b.PairID, b.ChildID, b.ParentID, oh.Level + 1 AS Level
            FROM BusinessHierarchy AS b INNER JOIN
            TESTER AS oh ON b.ParentID = oh.ChildID)

SELECT PairID, @StartingId, ParentID, Level
FROM  TESTER AS x
ORDER BY Level, ChildID, ParentID
于 2010-01-12T01:40:47.597 に答える
0

書かれたCTEは私を混乱させただけなので、次のように書き直しました。あなたが求めている結果が得られます。これはあなたの要件を満たしていますか?

WITH List (pairID, childId, parentId, level, originalid )
AS
(
    -- Anchor member definition
    select pairID, childID, parentID, 0 as level, ChildID as originalid
    FROM    
    BusinessHeirarchy bh
    where bh.PairID = 0


    UNION ALL

    -- Recursive member definition
    select j.pairId, j.childID, j.parentID, lst.level +1 as level, lst.originalid
    from BusinessHeirarchy j inner join List lst 
    on  (lst.parentId = j.ChildID)

)

select * from list;

もちろん、必要に応じて出力列と順序を操作できますが、そのデータは必要なものと一致します。

私のSQLで注意すべきことの1つは、サンプルデータにnullがなかったため、0のペアIDに基づいてアンカークエリを制限したことです。アンカーを引き出すために null チェックが必要な場合、これは簡単に変更できます。

次に、アンカー クエリからの最初の childId を保持する追加の列 OriginalId を使用して、親から子への関係を結合します。

于 2010-01-12T01:57:14.220 に答える