2

これは一般的な「再帰ルックアップ」タイプの質問であり、SO には多くの質問があることは知っていますが、特定の問題を解決する答えが見つかりません。お客様から譲り受けたデータで解決したい課題です。

次の表の例 (実際のデータの単純化されたバージョン) を検討してください。

ancestor_page_id parent_page_id page_id page_name 
---------------- -------------- ------- ---------
NULL             1              3       ROOT A
NULL             3              4       CHILD A
NULL             4              5       SUB CHILD A
NULL             4              6       SUB CHILD B
NULL             5              7       SUB SUB CHILD A
NULL             2              8       ROOT B
NULL             8              9       CHILD B
NULL             9              10      SUB CHILD C
NULL             9              11      SUB CHILD D
NULL             10             12      SUB SUB CHILD B

どうすればそれをフォームに入れることができますか:

ancestor_page_id parent_page_id page_id page_name 
---------------- -------------- ------- ---------
1                1              3       ROOT A
1                3              4       CHILD A
1                4              5       SUB CHILD A
1                4              6       SUB CHILD B
1                5              7       SUB SUB CHILD A
2                2              8       ROOT B
2                8              9       CHILD B
2                9              10      SUB CHILD C
2                9              11      SUB CHILD D
2                10             12      SUB SUB CHILD B

ancestor_page_idは先祖代々の価値parent_page_idです。

私はparent_page_id1を知っ2ており、レコードが必要ですが、存在しません (FK 制約はありません)。

これが理にかなっていることを願っています。助けてください!

4

2 に答える 2

0

これは必要な出力を提供しますか?

DECLARE @TABLE TABLE
(
    ancestor_page_id INT NULL,
    parent_page_id INT NOT NULL,
    page_id INT NOT NULL,
    page_name VARCHAR(50) NOT NULL
);
INSERT INTO @TABLE
VALUES
(NULL, 1,  3, 'ROOT A'),
(NULL, 3,  4, 'CHILD A'),
(NULL, 4,  5, 'SUB CHILD A'),
(NULL, 4,  6, 'SUB CHILD B'),
(NULL, 5,  7, 'SUB SUB CHILD A'),
(NULL, 2,  8, 'ROOT B'),
(NULL, 8,  9, 'CHILD B'),
(NULL, 9,  10, 'SUB CHILD C'),
(NULL, 9,  11, 'SUB CHILD D'),
(NULL, 10, 12, 'SUB SUB CHILD B');

WITH CTE(ancestor_page_id, parent_page_id, page_id, page_name)
AS
(
    SELECT
        parent_page_id AS ancestor_page_id, 
        parent_page_id, 
        page_id, 
        page_name
    FROM
        @TABLE 
    WHERE
        page_name LIKE 'ROOT%' -- An assumption for the anchor?

    UNION ALL

    SELECT
        CTE.ancestor_page_id,
        T.parent_page_id, 
        T.page_id, 
        T.page_name     
    FROM
        CTE
        INNER JOIN @TABLE AS T
        ON T.parent_page_id = CTE.page_id    
)

SELECT * FROM CTE
ORDER BY ancestor_page_id, parent_page_id, page_id
于 2013-08-30T10:19:37.253 に答える