给定childID时如何爬行公司结构

时间:2012-08-13 20:20:53

标签: sql sql-server sql-server-2008

我想知道抓取公司结构的有效方法是使用父ID。基本上我要做的是找到存在的第一个ContactID,因为这些联系人会继承到子位置。

例如:

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

所以Bob将继承底特律和Algoma。每个级别都有一个ID和一个父ID,当然这些ID与Parent的ID相匹配。如果给予ChildID(Algoma),我将如何爬到并检查Algoma上方的每个级别以获得联系,直到我到达密歇根州?每个级别只有1个联系人。没有固定的结构,所以联系人可能在子位置,或者在你到达联系人之前它可能是20级,但它始终是结构上第一个上升的树。任何想法都是适用的。

TABLE:

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.这不是每个公司的静态结构,可以有更多或更短的级别。

2 个答案:

答案 0 :(得分: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 example。)

答案 1 :(得分:2)

使用递归Common Table Expression是解决问题的有效方法。

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