棘手的SQL查询

时间:2009-02-17 02:25:16

标签: sql

所以我有这个表,有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>

感谢。

5 个答案:

答案 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个级别)默认情况下)。我可以根据要求发布代码。