zoukankan      html  css  js  c++  java
  • 非典型T_SQL的总结

     

    ------over的两种常用的用法---

    --第一种分组 当然要注意了,这里的分组并不是实际的分组,而是根据你的业务需求而坐的临时分组

     

    select

    roomguid,Room,

    avg(total) over(partition by bldGUID) as 楼栋均价,

    AVG(total) over(partition by ProjGUID) as 项目均价

    from p_room

     

    --产生行号 用来产生行号的时候,over()一定要order by

    select

    ROW_NUMBER() over(order by roomguid) as rownum

    from p_room

     

     

    ------apply 用法比cross join 更加灵活些

    当然apply也是一种表连接join 的用法 ,不过在形式上更加灵活些,他可以不用连接一张完整的表,可以是表的某个字段都行

    注意末尾必须要有表的别名,即使别名用不到

    cross apply (select 课程,分数 from #T2 where 姓名 =a.姓名) b

    --测试代码:

    create table #T(姓名 varchar(10))

    insert into #T values('张三')

    insert into #T values('李四')

    insert into #T values(NULL )

       

       

    create table #T2(姓名 varchar(10) , 课程 varchar(10) , 分数 int)

    insert into #T2 values('张三' , '语文' , 74)

    insert into #T2 values('张三' , '数学' , 83)

    insert into #T2 values('张三' , '物理' , 93)

    insert into #T2 values(NULL , '数学' , 50)

     

    ---cross apply ---注意末尾必须要有表的别名

    select * from #T as a

    cross apply (select 课程,分数 from #T2 where 姓名 =a.姓名) b

     

    ---outer apply

    select * from #T as a

    outer apply (select 课程,分数 from #T2 where 姓名 =a.姓名) b

     

    -----with 实现递归

    with test

    as

    (

     select UserGUID from MyUser group by UserGUID order by UserGUID

    )

    select * from test

    ---以上是一个with用法非常简单的示例,此时你可以将test看成一张临时表,然后再查询使用

     

    --1、如果CTE的表达式名称与某个数据表或视图重名,则紧跟在该CTE后面的SQL语句使用的仍然是CTE,当然,后面的SQL语句使用的就是数据表或视图了

    --2、使用with要注意的地方:

    --3、 不能在 CTE_query_definition 中使用以下子句:

    --(1)COMPUTE 或 COMPUTE BY

    --(2)ORDER BY(除非指定了 TOP 子句)

    --(3)INTO

    --(4)带有查询提示的递归成员中不允许出现下列项

        --SELECT DISTINCT

       -- GROUP BY

        --HAVING

        --标量聚合

        --TOP

       -- LEFT、RIGHT、OUTER JOIN(允许出现 INNER JOIN)

       -- 子查询 OPTION 子句

    --(5)FOR XML

    --(6)FOR BROWSE

    ---4、但with一般是用于实现递归的,如果你想实现递归,那么就必须用union all,其实用cte实现递归查询是比较死的东西 OPTION(MAXRECURSION 1) -- OPTION(MAXRECURSION 1)控制递归的层级数

     

    WITH myClass

    AS

    ( ----首先我要根据条件拿到我的根节点

     SELECT ClassFullCode,ClassFullName, 1 as level

     FROM s_class

     WHERE ParentCode = '' or ParentCode is null

     UNION all

     ---根据条件循环遍历 cls.PraentCode = my.ClassFullCode 这就是遍历的条件

     SELECT cls.ClassFullCode,cls.ClassFullName,level + 1

     FROM s_Class cls join myClass my ON cls.ParentCode = my.ClassFullCode

    )

    SELECT ClassFullCode,ClassFullName,level FROM myClass

    OPTION(MAXRECURSION 1) --error 控制递归的层级数

    ----pivot的用法

    SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]--这里是PIVOT第三步(选择行转列后的结果集的列)这里可以用"*"表示选择所有列,也可以只选择某些列(也就是某些天)

    --FROM WEEK_INCOME --这里是PIVOT第二步骤(准备原始的查询结果,因为PIVOT是对一个原始的查询结果集进行转换操作,所以先查询一个结果集出来)这里可以是一个select子查询,但为子查询时候要指定别名,否则语法错误

    --PIVOT

    --(

     -- SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])--这里是PIVOT第一步骤,也是核心的地方,进行行转列操作。聚合函数SUM表示你需要怎样处理转换后的列的值,是总和(sum),还是平均(avg)还是min,max等等。例如如果week_income表中有两条数据并且其week都是"星期一",其中一条的income是1000,另一条income是500,那么在这里使用sum,行转列后"星期一"这个列的值当然是1500了。后面的for [week] in([星期一],[星期二]...)中 for [week]就是说将week列的值分别转换成一个个列,也就是"以值变列"。但是需要转换成列的值有可能有很多,我们只想取其中几个值转换成列,那么怎样取呢?就是在in里面了,比如我此刻只想看工作日的收入,在in里面就只写"星期一"至"星期五"(注意,in里面是原来week列的值,"以值变列")。总的来说,SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])这句的意思如果直译出来,就是说:将列[week]值为"星期一","星期二","星期三","星期四","星期五","星期六","星期日"分别转换成列,这些列的值取income的总和。

    --)TBL--别名一定要写

     

     

    --update 更新方式的总结

    create table music

    (

    id int identity(1,1),

    school varchar(200),

    name varchar(100)

    )

     

    insert into music values('湖北大学','陈宏业')

    insert into music values('湖北大学','陈哲'),('湖北大学','吕俊'),('湖北大学','唐虎笑'),('湖北大学','何文奇')

    insert into music values('武汉科技大学','徐乐乐'),('湖北大学','王红'),('湖北大学','陈磊'),('湖北大学','魏德洲')

     

    create table music3

    (

     id int ,

     school varchar(200),

     name varchar(200),

     name2 varchar(200)

    )

     

    select * from music2

    ---第一种复制语句语法 后面的select 不管你是多表select 还是单表,都无所谓,但是要和前面的类型匹配就ok

    insert into music2(id,school,name) select * from music

    ---第二种 (默认会常见一张新表) 复制某一列 将name换成*则是复制整张表

    select name into music5 from music

    --自定义复制(筛选条件)

    select * into music6 from music where id > 3

    select * from music5 

     

    ---sql 删除语法

    DELETE from cb_AdjustKhDtl from cb_AdjustKhDtl inner join cb_CostKh t2 on cb_AdjustKhDtl.CostKhGUID= t2.CostKhGUID 

     

  • 相关阅读:
    【Vegas原创】更改Linux系统默认语言
    【Vegas原创】RMAN还原一个损坏的user表空间的数据文件
    【Vegas原创】VMWare虚拟的Linux系统下,安装VMWare的增强工具
    【Vegas原创】在线修改redo.log文件的大小
    【Vegas原创】DB和DG的切换
    [工程备案]linux平台,用第三方开源库进行网页抽取和数据解析
    各种流派的正则表达式说明以及shell正则表达式
    python 自然语言处理编码转换
    工作总结2013
    linux上配置boost手记
  • 原文地址:https://www.cnblogs.com/xulele/p/5327960.html
Copyright © 2011-2022 走看看