【发布时间】:2017-12-12 05:52:05
【问题描述】:
我有一个包含两列的数据集。第一列中的人可能在第二列中的人的控制范围内(即每个人都在迈克尔的控制范围内,德怀特和斯坦利在吉姆的控制范围内):
source_id source target_id target
1 Michael Scott 5 Kelly Kapoor
3 Dwight Schrute 2 Jim Halpert
4 Stanley Hudson 2 Jim Halpert
2 Jim Halpert 5 Kelly Kapoor
我有一张表格,列出了每个人和他们的主管:
person_id person supervisor_id supervisor
1 Michael Scott 0 None
2 Jim Halpert 1 Michael Scott
3 Dwight Schrute 2 Jim Halpert
4 Stanley Hudson 2 Jim Halpert
6 Ryan Howard 1 Michael Scott
5 Kelly Kapoor 6 Ryan Howard
我有一段代码使用递归从上表中查找单个人的控制范围:
with anchor as
(
select person_id, supervisor_id from table where unique_id = @ID
union all
select a.person_id, a.supervisor_id
from table a
inner join Anchor b ON b.person_id = a.supervisor_id
)
select a.person_id
from anchor a
这段代码可以变成存储过程或函数。为 Jim 运行它(例如),返回:
person_id
3 (Dwight Schrute)
4 (Stanley Hudson)
如何将初始数据集中的每个值(来自源列和目标列)与前面代码块返回的列中的值进行比较?换句话说,对于source 中的每一行,我需要检查该名称是否在target 的控制范围内。此外,对于target 中的每一行,我需要检查该名称是否在source 的控制范围内。
期望的最终结果:
source_id source target_id target isEitherPersonInOther'sSOC
1 Michael Scott 5 Kelly Kapoor Yes
3 Dwight Schrute 2 Jim Halpert Yes
4 Stanley Hudson 2 Jim Halpert Yes
2 Jim Halpert 5 Kelly Kapoor No
我知道迭代很糟糕(即使用游标或 while 循环为每一行运行存储过程)。我也知道cross apply 和一个函数一起可能会起作用,但我一直无法解决这个问题。
感谢大家提供的任何见解!
【问题讨论】:
-
首先,我会给每个人一个唯一的 ID,这样你就不会'加入名字......如果你有两个 Jim Halperts 怎么办
-
我有一个唯一的 ID,只是为了便于说明而使用了名称。
-
永远不要忽略可能相关的内容;)因为解决方案不会假设
-
谢谢 - 我更新了它以包含 ID
-
确实如此,因为它们是独立的数据集。源和目标是人员之间链接的数据集 - 可以链接两个主管,可以链接两个没有控制范围的人,等等。或者,人员和主管表是斯克兰顿 Dunder Mifflin 的员工主表。
标签: sql sql-server tsql recursion stored-procedures