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 回答