Sql Server 临时结果集与递归-CTE


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
CTE: Common Table Express 指定临时命名的结果集

1, 当sql语句比较大时,可以用CTE将小结果集拆分,以便阅读
    WITH mycre(id,name) AS ( select id ,name from mddepartment )
    SELECT * FROM frmuser JOIN mycre ON frmuser.DepartmentID= mycre.id
 注:1)CTE 之后必须直接使用,间隔sql语句就会失效
        2)在用with时并不会执行查询,只是凑sql语句,只有当with后面的select *引用cte时才会执行

2,递归使用,依次引用自身。递归 CTE 定义至少必须包含两个 CTE 查询定义(一个定位点成员和一个递归成员)
 WITH departments(id,Departname,depth) as(
    SELECT id,Departname,1 depth FROM mdDepartment md
    WHERE md.ParentID = 2   --找到广告商务部的直接子部门 定位点成员,depth指定深度
    UNION ALL
    SELECT md.id,md.Departname,depth+1 FROM mdDepartment md --找到子部门的子部门 递归成员
    JOIN departments d ON md.ParentID = d.id
   
)
SELECT * FROM departments
    注:1)定位点成员之间必须使用UNION ALL、UNION、INTERSECT、EXCEPT集合运算符,最后一个定位点成员与递归成员之间必须使用UNION ALL,递归成员之间也必须使用UNION ALL连接,定位点成员和递归成员中的字段数量和类型必须完全一致,递归成员的FROM子句只能引用一次CTE对象。
           2)递归成员中不允许出现下列项
              SELECT DISTINCT
              GROUP BY
              HAVING
              标量聚合
              TOP
              LEFT、RIGHT、OUTER JOIN(允许出现 INNER JOIN)
              子查询