sql - 给定 childID 后如何爬取公司结构

标签 sql sql-server sql-server-2008

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

例如:

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

所以鲍勃将被继承到底特律和阿尔戈马。每个级别都有一个 ID 和一个 Parent ID,当然它与 Parent 的 ID 相匹配。如果给定了 ChildID(Algoma),我将如何爬上并检查 Algoma 上方的每个级别以获取联系人,直到到达密歇根?每个级别只有 1 个联系人。没有固定的结构,因此联系人可能位于子位置,也可能在到达联系人之前向上 20 层,但从结构上看,它始终是树上的第一个位置。任何想法都会被采纳。

表:

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

最佳答案

递归查询来救援!
还有一个家长优先的版本:

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 。)

关于sql - 给定 childID 后如何爬取公司结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11941687/

相关文章:

sql - 根据聚合数据对行进行排序

MySql 使用单独查询或子查询更快?

sql - 将 SQL 数据拆分为月份

sql-server-2008 - 如果没有报告记录,则显示 MessageBox

sql - 使用 Openquery 链接服务器更新表

使用链接时从 SQL 中减去的 PHP 代码

mysql - 删除 MySQL 中的多行

sql-server - 如果 sql server 的服务器排序规则区分大小写而数据库不区分大小写,那么查询是否区分大小写?

sql - 如何在命令提示符(CMD)中执行SQL语句

sql - T-SQL 为每个日期转换 DateTime 和 Count 条目