我想知道抓取公司结构的有效方法是使用父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.这不是每个公司的静态结构,可以有更多或更短的级别。
答案 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