zoukankan      html  css  js  c++  java
  • SqlServer笔记-公用表表达式(CTE)

    公用表表达式和派生表类似的另一种形式的表表达式,CTE中是先定义表,然后再引用,结构比较清晰

    CTE相比派生表的优势:如果有多个子查询,不需要像派生表那样嵌套,只需要在WITH中定义多个CTE,每个CTE可以引用它前面定义的所有CTE

    派生表:from子句中的子查询。

    select * 
    from
    (select 1,2,3) tb(c1,c2,c3)  --c1、c2、c3是列别名

    CTE:

    with 
    tb(c1,c2,c3)
    as (select 1,2,3) select * from tb

    多个CTE:

    with 
    tb1(c1,c2,c3) as (select 1,2,3),
    tb2(c1,c2,c3) as (select * from tb1) 
    select * 
    from tb2

    多个相同的派生表使用一个CTE就可以:

    --派生表相同,重复写了两遍
    SELECT tb1.years,tb1.ordercount 当年订单数,tb2.ordercount 上年订单数,tb1.ordercount-tb2.ordercount 差额 FROM (SELECT YEAR( AddTime) years,COUNT(ID) ordercount FROM TB_Order GROUP BY YEAR(AddTime)) tb1 join (SELECT YEAR(AddTime) years,COUNT(ID) ordercount FROM TB_Order GROUP BY YEAR(AddTime)) tb2 on tb1.years=tb2.years+1
    --只需要写一个CTE,可重用
    WITH tb AS (SELECT YEAR( AddTime) years,COUNT(ID) ordercount FROM TB_Order GROUP BY YEAR(AddTime)) SELECT tb1.years,tb1.ordercount 当年订单数,tb2.ordercount 上年订单数,tb1.ordercount
    -tb2.ordercount 差额 FROM tb AS tb1 join tb AS tb2 on tb1.years=tb2.years+1

     递归CTE:

    比如有一个类目表,类目有上下级关系,给定一个类目如何查出所有下级类目?这时候可以使用递归CTE实现此功能

    WITH leimu
    AS
    (
        --起点,仅执行一次
        SELECT ID,Name,ParentID FROM TLZ_LEIMU
        WHERE parentid=0
        
        UNION ALL    --合并
    
        --递归查询,可能多次执行,直到查询结果为空
        SELECT ID,Name,ParentID FROM TLZ_LEIMU c
        INNER JOIN leimu p
        WHERE c.parentid=p.id
    )
    SELECT * FROM leimu

    未完待续

  • 相关阅读:
    S4全球总决赛(2)南邮NOJ2059
    S4全球总决赛(2)南邮NOJ2059
    S4全球总决赛(1) 南邮NOJ
    S4全球总决赛(1) 南邮NOJ
    S4全球总决赛(1) 南邮NOJ
    【Linux】鸟哥的Linux私房菜基础学习篇整理(五)
    【Linux】鸟哥的Linux私房菜基础学习篇整理(四)
    【HDOJ】2428 Stars
    【Linux】鸟哥的Linux私房菜基础学习篇整理(三)
    【Linux】鸟哥的Linux私房菜基础学习篇整理(二)
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12123362.html
Copyright © 2011-2022 走看看