用户层级递归查询的笔记

来源:http://www.cnblogs.com/wenyang-rio/p/3722868.html

当前已知ID,怎么获取他的子节点数据呢?怎么获取父节点的数据呢?

    LZ也不卖关子了,就是如题所说的使用WITH AS语句,它可以提高性能简化嵌套SQL,而且多级递归有时候嵌套SQL都很难下手,LZ以前甚至在应用程序中用C#递归获取数据的笨方法。

    WITH AS的含义

    WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会
被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数
据的部分。 
    特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,
所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将
WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS

短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。


创建一张企业员工表,表数据库设计如下:
CREATE TABLE [dbo].[Employee](
    [ID] [uniqueidentifier] NOT NULL,--用户ID
    [EnterpriseCode] [uniqueidentifier] NOT NULL,--企业标识
    [ParentGUID] [uniqueidentifier] NOT NULL,--上级ID
    [ECode] [nvarchar](50) NOT NULL,--员工编号
    [EName] [nvarchar](200) NOT NULL--员工名称
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
如果已知当前用户ID我要想知道他的上级领导有哪些,可编写sql语句如下
WITH    Emp
          AS ( SELECT   ID ,
                        EName ,
                        ParentGUID
               FROM     dbo.Employee
               WHERE    ID = '5C8214EC-258B-4C44-9F31-206E499F0285'
               UNION ALL  
               SELECT   d.ID ,
                        d.EName ,
                        d.ParentGUID
               FROM     Emp
                        INNER JOIN dbo.Employee d ON d.ID = Emp.ParentGUID
             )
    SELECT ID,EName
    FROM    Emp

相反,如果已知当前用户ID,怎么获取他的下级呢,编写sql语句如下
WITH    Emp
          AS ( SELECT   ID ,
                        EName ,
                        ParentGUID
               FROM     dbo.Employee
               WHERE    ID = '0CD19311-2CA1-4120-9554-11BFD8219AF9'
               UNION ALL  
               SELECT   d.ID ,
                        d.EName ,
                        d.ParentGUID
               FROM     Emp
                        INNER JOIN dbo.Employee d ON d.ParentGUID = Emp.ID
             )
    SELECT ID,EName
    FROM    Emp



 
  

你可能感兴趣的:(sql)