• SQL Server 中 with tmp 临时表的用法


    SQL Server 中 with tmp 临时表的用法
    ----------with临时表用法,有时候采用临时表比采用in的效率更高,避免了全表扫描。
    实例中实现了查询普通题、大题、子题目的sql
    -----------(对于大题套小题,采用先查小题信息再反查大题相关信息的方式)
    一、简答
    1. 会计师的定义?
      a。AAAA
      b。BBBB
      c。CCCC
      d。DDDD
    二、判断
     2.下面那个是对的?
      a。对
      b。错
    三、简答题
    3. 看一段文字描述,回答每个小题目:
      <1>、第一个小题目 
      a。AAAA
      b。BBBB
      c。CCCC
      d。DDDD
      <2>、第二个小题目 
      a。AAAA
      b。BBBB
      c。CCCC
      d。DDDD
    ------------
    with tmp as (
      select distinct parentID
          from QZ_SIM_PAPER_QUESTION
         WHERE simPaperID = 205
           and isDel <> 1
           and ansResult = -1
           and queType <> 4
           and parentID <> 0
    )
    select * from 
     (SELECT t.*
      FROM QZ_SIM_PAPER_QUESTION t,tmp
     WHERE (t.questionID = tmp.parentID or t.parentID = tmp.parentID) and t.simPaperID = 205) tmp2 
    union  all (SELECT *
        FROM QZ_SIM_PAPER_QUESTION
       WHERE isDel <> 1 and queType <> 4 and parentID = 0 and simPaperID = 205 and
             ansResult = -1) order by parentID,queType
    在使用CTE时应注意如下几点:
    1. CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效;
    with 
    cr as 
        select CountryRegionCode from person.CountryRegion where Name like 'C%' 
    select * from person.CountryRegion  -- 应将这条SQL语句去掉
    -- 使用CTE的SQL语句应紧跟在相关的CTE后面-- 
    select * from person.StateProvince where CountryRegionCode in (select * from cr) 
    2. CTE后面也可以跟其他的CTE,但只能使用一个with,多个CTE中间用逗号(,)分隔;
    with 
    cte1 as 
        select * from table1 where name like 'abc%' 
    ), 
    cte2 as 
        select * from table2 where id > 20 
    ), 
    cte3 as 
        select * from table3 where price < 100 
    select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id 
    3. 如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句
    使用的就是数据表或视图了;
    --  table1是一个实际存在的表
    with 
    table1 as 
        select * from persons where age < 30 
    select * from table1  --  使用了名为table1的公共表表达式
    select * from table1  --  使用了名为table1的数据表
    4. CTE 可以引用自身,也可以引用在同一WITH 子句中预先定义的CTE。不允许前向引用。
    5. 不能在CTE_query_definition 中使用以下子句:
    (1)COMPUTE 或COMPUTE BY
    (2)ORDER BY(除非指定了TOP 子句)
    (3)INTO
    (4)带有查询提示的OPTION 子句
    (5)FOR XML
    (6)FOR BROWSE
    6. 如果将CTE 用在属于批处理的一部分的语句中,那么在它之前的语句必须以分号结尾。
    declare @s nvarchar(3) 
    set @s = 'C%' 
    ;  -- 必须加分号
    with 
    t_tree as 
        select CountryRegionCode from person.CountryRegion where Name like @s 
    select * from person.StateProvince where CountryRegionCode in (select * from t_tree) 
  • 相关阅读:
    python操作MySQL数据库(转)
    python3.3.2中的关键字(转)
    HashMap的键值需要注意什么?
    为什么基本类型不能做为HashMap的键值?
    怎么确保一个集合不能被修改?
    Iterator和 ListIterator有什么区别?
    Iterator怎么使用?有什么特点?
    迭代器Iterator是什么?
    哪些集合类是线程安全的?
    Queue的element()和peek()方法有什么区别?
  • 原文地址:https://www.cnblogs.com/wuxiang/p/3671314.html
Copyright © 2020-2023  润新知