所以我有这个表,有3列:ID(唯一键),PositionID和SupervisorID。 PositionID和SupervisorID都是Positions表的外键。
我无法弄清楚的是获得继承的下属的一种不错的方式。例如:
ID PositionID SupervisorID
1 2 1
2 2 3
3 3 4
4 1 5
...
我如何根据它们从属的位置选择2,3和4.当前的解决方案是一种非常混乱的方式,并且看起来很常见的问题可能是有一种可接受的方法。< / p>
感谢。
答案 0 :(得分:4)
答案 1 :(得分:2)
如果您有Microsoft SQL Server 2008,则应查看HierarchyId数据类型。我认为这正是你要找的。你可以在没有这种类型的情况下做到这一点但是你必须听其他人。 ;)
答案 2 :(得分:2)
你可以尝试:
WITH HierarchyCTE (ID, PositionID, SupervisorID)
AS
(
SELECT ID, PositionID, SupervisorID
FROM SomeTable
WHERE ID = 1
UNION ALL
SELECT b.ID, b.PositionID, b.SupervisorID
FROM SomeTable AS b
INNER JOIN HierarchyCTE AS c ON b.ID = c.PositionID
)
SELECT ID, PositionID, SupervisorID FROM HierarchyCTE
或接近它的东西应该有用。
答案 3 :(得分:1)
你可以使用标准SQL(可能是任何具有各种SQL增强功能的深度)对某个深度执行此操作,但SQL语句将是撒旦自己的恶魔深处可怕的可憎之物。
SQL是一种关系代数,不适用于程序模型。说真的,使用代码(即使它是存储过程或PL / SQL),它将使您的SQL更漂亮,您的DBA和未来的维护者更快乐,您的生活更长,更繁荣。
答案 4 :(得分:0)
我写了一些查询来做这件事并爆炸物料清单。我在while循环中使用了一个查询,该查询选择临时表和递归公用表表达式。据我所知,这些是没有使用递归函数/ sproc的唯一方法 - 由于各种原因(在我的视图中)是不可行的(首先是因为sql server被限制在16个级别)默认情况下)。我可以根据要求发布代码。