2

親 ID を使用して、会社の構造を効率的にクロールする方法を考えています。基本的に、私がやろうとしているのは、存在する最初の ContactID を見つけることです。これらの連絡先は子の場所に継承されるためです。

例えば:

Test Account
-North
--Michigan - Bob
---Detroit
----Algoma
-South
-East
-West

したがって、ボブはデトロイトとアルゴマに継承されます。各レベルには、もちろん親の ID と一致する ID と親 ID があります。ChildID(Algoma) が与えられた場合、ミシガン州に到着するまでどうやって這い上がり、Algoma の上の各レベルで連絡先を確認しますか? 各レベルには 1 つの連絡先しかありません。構造が設定されていないため、連絡先は子の場所にある場合もあれば、連絡先に到達する前に 20 レベル上にある場合もありますが、構造的にツリーを上っていく最初の 1 つです。どんなアイデアも評価されます。

テーブル:

ID ParentID LevelName ContactID
1     NULL   TestCo.    NULL
2     3      Algoma     NULL
3     4      Detroit    NULL
4     5      Michigan   2
5     1      North      3
6     1      South      1
7     1      East       3
8     1      West       NULL

@ID = 2 を渡すと、ContactID = 2 が返されます。これはすべての企業の静的構造ではなく、多くのレベルが深くなったり短くなったりする可能性があります。

4

2 に答える 2

3

救助への再帰クエリ!
親優先バージョンもあります。

WITH Parent (id, contactId) as (SELECT id, contactId
                                FROM Company
                                WHERE parentId IS NULL
                                UNION ALL
                                SELECT Company.id, 
                                       COALESCE(Company.contactId, 
                                                Parent.contactId)
                                FROM Company
                                JOIN Parent
                                ON Parent.id = Company.parentId)

SELECT *
FROM Parent
WHERE id = 2;

(動作する SQLFiddle のがあります。)

于 2012-08-13T21:01:30.503 に答える
2

再帰的な共通テーブル式を使用すると、問題を効率的に解決できます。

WITH CTE AS
(
    SELECT
        ID,
        ParentID,
        ContactID,
        0 AS depth
    FROM tbl
    WHERE tbl.ID = 2 --Start point

    UNION ALL

    SELECT
        tbl.ID,
        tbl.ParentID,
        tbl.ContactID,
        CTE.depth + 1
    FROM tbl
    JOIN CTE ON CTE.ParentID = tbl.ID
    WHERE CTE.ContactID IS NULL
)
SELECT TOP 1 ContactID
FROM CTE
ORDER BY depth desc
于 2012-08-13T20:58:18.137 に答える