SQL 中使用With As处理层级关系小记

SQL 中使用With As处理层级关系小记

当遇见数据中需要查询上下级关系,并且不知道到底有多少层级的时候,如果我们按照while循环语句来查询的话,效率低下并且很有可能还会出错,找不全所有的上下级;这个时候就需要使用一种叫With As的语句来帮助我们快速的循环嵌套我们需要的数据。

先上代码:

            with allNotes(UserID,LeaderID) as (
                SELECT UserID,LeaderID FROM [dbo].[RightGroupAccessLevelsOfPositions]
                where LeaderID = @UserID
                union all  
                select ChildNote.UserID,ChildNote.LeaderID 
                from [dbo].[RightGroupAccessLevelsOfPositions] ChildNote
                inner join allNotes parentNote on ChildNote.LeaderID = parentNote.UserID 
            )  


            select * FROM allNotes 

这里可以看见在With As语句中分成两部分,并用Union all连接起来,先根据我们上级用户,查询出其下级所有的用户,并通过Union all 和inner jion 的 ChildNote.LeaderID = parentNote.UserID 形成一个自动循环语句,把该表中所有的层级搜索出来。

最后查询allNotes 这一个临时表的数据


有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。


注:在With As语句中union allinner join是固定搭配,例如:left join 和 right join 对该用法不支持。

如果递归执行的次数超过了 maxrecursion 限定的次数,sql server 便会提示错误;这个时候就需要在代码后面加上OPTION(MAXRECURSION 0);来设置它的限定次数,默认是100次,当我们把它设置为0,表示不做控制。

你可能感兴趣的:(数据库优化编写)