【问题标题】:Confused how this query works对这个查询的工作方式感到困惑
【发布时间】:2009-02-12 21:58:24
【问题描述】:

我正在尝试学习高级 sql 以及如何使用系统查询 (sql server)。下面的查询有点混乱。

CREATE PROC dbo.ShowHierarchy
(
    @Root int
)
AS
BEGIN
    SET NOCOUNT ON
    DECLARE @EmpID int, @EmpName varchar(30)

    SET @EmpName = (SELECT EmpName FROM dbo.Emp WHERE EmpID = @Root)
    PRINT REPLICATE('-', @@NESTLEVEL * 4) + @EmpName

    SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root)

    WHILE @EmpID IS NOT NULL
    BEGIN
        EXEC dbo.ShowHierarchy @EmpID
        SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID)
    END
END
GO

取自这里:

http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm

每次查询运行时,@EmpId 参数如何递增?它自己做吗?另外,@root 每次递归都会增加吗?例如。 CEO 是 root,去直属下属,那个直属下属现在是@root,等等。

谢谢

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    每次查询运行时,@EmpId 参数如何递增?它自己做吗?

    这个:

    SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID)
    

    选择大于已选择的最小EmpID,并将其分配给@EmpID

    当然,如果有的话,新的@EmpID会大于旧的,也就是说@EmpID会增加。

    【讨论】:

    • 你领先我几秒。 ;-)
    【解决方案2】:

    在最后一个选择中,@EmpID 设置为大于@EmpID 的最低 EmpID。这样,@EmpID 将“递增”,直到没有更大的 EmpID。在这种情况下,select min(EmpID) 返回 null,while 循环结束。

    @Root 通过在 EXEC 语句中对 ShowHierarchy 的递归调用进行更改。基本上,当前的@EmpID 在被触发的执行中变成了新的@Root。

    【讨论】:

      【解决方案3】:

      正如 Quassnoi 所说,这是 @EmpId 递增的地方:

      SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID)
      

      是的,当递归调用该过程时,它会将当前递归的@EmpID 作为新的@Root 传递:

      EXEC dbo.ShowHierarchy @EmpID
      

      【讨论】:

        猜你喜欢
        • 2012-08-24
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多