• Sql Server 公用表达式(CTE)


    简介      

               对于select查询语句来说,通常情况下,为了使T-SQL代码更加简洁和可续,在一个查询中引入另外的结果集都是通过视图而不是子查询来进行分解的,但是,视图是作为系统对象存在数据库中,那对于结果集仅仅需要在存储过程或是用户自定义函数中使用一次的时候,使用视图就显得有些奢侈了。

         公用表表达式(Common Table Expression)是SQL SERVER 2005版本之后引入的一个特性.CTE可以看作是一个临时的结果集,可以在接下来的一SELECT,INSERT,UPDATE,DELETE,MERGE语句中被多次引用。使用公用表达式可以让语句更加清晰简练.

         公用表表达式其实提供的功能和视图差不多,但是它不像视图一样把sql语句保存在我们的数据库里面。虽然CTE不是必需的,但是它可以为提高sql的可读性

         微软官方给的使用CET的优势:

    • 编写一个递归查询(类似树查询)
    • 使用要使用一个类似视图的功能,但是又不想把这个查询sql语句的定义保存在数据库
    • 要引用一个返回数据sql语句多次,只需要定义一次。
    公用表表达式(CTE)的定义

    公用表达式的定义非常简单,只包含三部分:

    1.   公用表表达式的名字(在WITH之后)
    2.   所涉及的列名(可选)
    3.   一个SELECT语句(紧跟AS之后)
      WITH expression_name [(column_name [,...n] )]
      AS
      ( 
        cte_query_definition
      )
    
    
    按照是否递归,可以将公用表(CTE)表达式分为递归公用表表达式和非递归公用表表达式.
    非递归公用表表达式(CTE)

       非递归公用表表达式(CTE)是查询结果仅仅一次性返回一个结果集用于外部查询调用。并不在其定义的语句中调用其自身的CTE

       非递归公用表表达式(CTE)的使用方式和视图以及子查询一致

       比如一个简单的非递归公用表表达式:

      1FXB@V13ZVV%F0QQBK5D%RC
       公用表表达式的好处之一是可以在接下来一条语句中多次引用:
    
    
    with cte_name
    as
    (
      select * from Sys_Log
    )
    select * from cte_name a inner join cte_name b on a.f_id=b.f_id

      由于CTE只能在接下来一条语句中使用,如果使用多次会提升cte名称无效

    1FXB@V13ZVV%F0QQBK5D%RC

       因此,当需要接下来的一条语句中引用多个CTE时,可以定义多个,中间用逗号分隔

    复制代码

    with cte_name1
    as
    (
      select * from Sys_Log
    ),
    cte_name2
    as
    (
      select * from Sys_Log
    )
    select * from cte_name1
    UNION
    select * from cte_name2

    复制代码

    递归公用表表达式(CTE)

    对于递归公用表达式来说,实现原理也是相同的,同样需要在语句中定义两部分:

    •    基本语句
    •    递归语句

    在SQL这两部分通过UNION ALL连接结果集进行返回:

    比如我现在有一张表 里面存的是树形结构,学院院系>专业>年纪>班级

    如何根据班级id查找他的所以父极了?

    {$P0HZ%RZJO$PA[MY}$N)6P

    也可以根据父级编号递归查询它所以的下级编号,

    A{N{]_08LI`EU1J%_(YEOC5

    这就是CTE的便利

    总结

        CTE是一种十分优雅的存在。CTE所带来最大的好处是代码可读性的提升,这是良好代码的必须品质之一。使用递归CTE可以更加轻松愉快的用优雅简洁的方式实现复杂的查询。

  • 相关阅读:
    [Java123] 方法重载中遇到的编译器错误: both methods have same erasure => 引入Java泛型type erasure
    [Java123] 认识JavaBean
    [Java123] HashMap实现和应用
    [Java123] 开源工具guava比较器链ComparisonChain (附加比较null空值的实现方法)
    [Java123] Java的异常处理机制
    [ORACLE123] sysdate处理
    Linux进程实时可视化监控
    【Java123】ThreadLocal学习笔记
    【XML123】了解XMLUnit
    字符串%s
  • 原文地址:https://www.cnblogs.com/studydp/p/9026847.html
Copyright © 2020-2023  润新知