Sql 2008 Study for two ------CTE(Command Table Expression)

来源:互联网 发布:redis 数据有效期 编辑:程序博客网 时间:2024/06/11 01:45

通用表达式就是提供了一种方法按姓名引用的临时结果集。类似于在运行中创建视图,并且它还可以完成视图无法完成的工作(递归查询)

1. 语法

with <CTE name> [(<column name>,[,...n])】

as

(<query returning tabular data>)

<startment that will make use of the  CTE>

2.实例

例子其实可以很简单随便在自己的数据里面找一张表

with  sgstuff(可以随意命名)  ( stuffnam,deputname)

as

(

select ts.sutffname,td.deputyname from to tb_stuffts join

tb_deputy td on ts.deputyid=td.deputyid

)

select * from sgstuff

这样一个简单的CTE就完成了

3.注意CTE使用不能包含的结构

a.Compute和Compute By

b. Order by

c.into

d. for xml for browse 和option查询子句

4.递归查询 这里用的是sql2008高级贬称例子

USE AdventureWorks2008;
GO


-- Establish the CTE foundation for the recursion
WITH Reports (ManagerID, BusinessEntityID, JobTitle, DepartmentID, Level)
AS
(
-- Establish the "Anchor Member"
-- This essentially defines the top node of the
-- recursion hierarchy
  SELECT hre.ManagerID, 
         hre.BusinessEntityID, 
         hre.JobTitle, 
         hredh.DepartmentID, 
         0 AS Level
  FROM HumanResources.Employee2 AS hre
  JOIN HumanResources.EmployeeDepartmentHistory AS hredh
    ON hre.BusinessEntityID = hredh.BusinessEntityID  
   AND hredh.EndDate IS NULL  -- Current employees only!
  WHERE hre.ManagerID IS NULL
  UNION ALL
-- Define the piece that actually recurses
  SELECT hre.ManagerID, 
         hre.BusinessEntityID, 
         hre.JobTitle, 
         hredh.DepartmentID, 
         r.Level + 1
  FROM HumanResources.Employee2 AS hre
  JOIN HumanResources.EmployeeDepartmentHistory AS hredh
    ON hre.BusinessEntityID = hredh.BusinessEntityID 
   AND hredh.EndDate IS NULL  -- Current employees only!
  JOIN Reports AS r
    ON hre.ManagerID = r.BusinessEntityID
)


-- Code to get it all started.
SELECT ManagerID, BusinessEntityID, JobTitle, Level
FROM Reports r
JOIN HumanResources.Department AS dp
  ON r.DepartmentID = dp.DepartmentID
WHERE dp.GroupName LIKE '%Admin%'
ORDER BY Level, ManagerID, JobTitle;
GO


5. 备注

Compute 和Compute by

COMPTE生成合计作为附加的汇总列出现在结果集的最后。当与BY一起使用时,COMPUTE 子句在结果集内生成控制中断和分类汇总。

CREATE  TABLE titles
(
id INT IDENTITY,
types INT ,
price MONEY,
advance MONEY
)

下列 SELECT 语句使用简单 COMPUTE 子句生成 titles 表中 price 及 advance 的求和总计:

USE pubs
SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) 

 


下列查询在 COMPUTE 子句中加入可选的 BY 关键字,以生成每个组的小计:

 USE pubs

SELECT type, price, advance
FROM titles
ORDER BY type
COMPUTE SUM(price), SUM(advance) BY type

 

此 SELECT 语句的结果用12 个结果集返回,六个组中的每个组都有两个结果集。每个组的第一个结果集是一个行集,其中包含选择列表中所请求的信息。每个组的第二个结果集包含 COMPUTE 子句中两个 SUM 函数的小计。


compute by 子句的规则:

(1)不能将distinct与行统计函数一起使用

(2)compute ??? by 子句中 ???出的列必须出现在选择列表中

(3)不能在含有compute by 子句的语句中使用select into 子句,因为包括compute 子句的语句会产生不规则的行。

(4)如果使用了compute by子句,则必须使用order by 子句, 而且compute by子句中的列必须包含在order by 子句中,并且对列的前后顺序和起始项都要一致(说白了compute by子句中的列必须是order by子句中列表的全部,或者前边的连续几个)。

(5)如果compute 省略了 by ,则order by 也可以省略

(6)如果compute by 子句包含多列时,会将一个组(第一个列分的组)分成若干个子组(利用后面的列),并对每层子组进行统计。

(7)使用多个compute by子句时,会分别按不同的组统计出结果。详细信息还是按照正常的第一个分组方式显示。

(8)compute by 子句中可以使用多个统计函数,他们互不影响

(9)compute by 子句中可以不包含by ,而只用compute  此时不对前面信息分组,而只对全部信息进行统计。


比较 COMPUTE 和 GROUP BY 
COMPUTE 和 GROUP BY 之间的区别汇总如下: 
GROUP BY 生成单个结果集。每个组都有一个只包含分组依据列和显示该组子聚合的聚合函数的行。选择列表只能包含分组依据列和聚合函数。 

COMPUTE 生成多个结果集。一类结果集包含每个组的明细行,其中包含选择列表中的表达式。另一类结果集包含组的子聚合,或 SELECT 语句 
的总聚合。选择列表可包含除分组依据列或聚合函数之外的其它表达式。聚合函数在 COMPUTE 子句中指定,而不是在选择列表中。 
下列查询使用 GROUP BY 和聚合函数;该查询将返回一个结果集,其中每个组有一行,该行中包含该组的聚合小计: 
USE pubs 
SELECT type, SUM(price), SUM(advance) 
FROM titles 
GROUP BY type 
说明 在 COMPUTE 或 COMPUTE BY 子句中,不能包含 ntext、text 或 image 数据类型。


OPTION 语法 

OPTION 子句用于指定在整个查询过程中的查询提示(Query Hint)。通常,用户不必使用OPTION 子句,因为查询优化器会自动选择一个最佳的查询计划。OPTION 子句必须由最外层的主查询来指定。各查询提示之间应使用逗号隔开。其语法如下: 
OPTION (<query_hint> [,...n] )
<query_hint> ::=
{ { HASH | ORDER } GROUP
| { CONCAT | HASH | MERGE } UNION
| { LOOP | MERGE | HASH } JOIN
| FAST number_rows
| FORCE ORDER
| MAXDOP number
| ROBUST PLAN
| KEEP PLAN
| KEEPFIXED PLAN
| EXPAND VIEWS
}
各参数说明如下: 
{HASH | ORDER} GROUP
指定在GROUP BY 或COMPUTE 子句中指定的查询使用散列法或排序法。所谓散列法是指为存储和检索数据项或数据,把搜索关键字转换为一个地址的一种方法。该方法常作为数据集内的记录的一种算法,可以使记录分组均匀,减少搜索时间。 
{MERGE | HASH | CONCAT} UNION
指定所有的UNION 操作符采用合并(Merge)、散列(Hash) 或连接(Concatenate)的方法执行操作。如果指定了多个UNION 提示,查询优化器会挑选一个最佳的提示方案。 
{LOOP | MERGE | HASH |} JOIN
指定查询过程中的所有连接操作采取循环连接(Loop Join)、合并连接(Merge Join)或散列连接(Hash Join) 的方法。如果指定了多个JOIN 提示,查询优化器会挑选一个最佳的提示方案。 
FAST number_rows


指定查询优化只用于迅速返回前number_rows 行数据,在number_rows 行以后的数据采用原查询方法。 
FORCE ORDER
指定在查询语法中说明的连接顺序在查询优化的过程中保持不变。 
MAXDOP number
忽略由Sp_configure 设定的针对查询的最大并行线程数目。 
ROBUST PLAN
强制查询优化器尝试使用最大行容量的计划。 
KEEP PLAN
强制查询优化器放松重新编译查询的阈值。指定此选项可以让一个表被多次更新而不必频繁地重新编译查询。 
KEEPFIXED PLAN
强制查询优化器不重新编译查询。这样只有当表的概要改变或执行Sp_recompile 存储过程时,才会重新编译查询。 
EXPAND VIEWS
扩展索引化视图(当一个视图的名称在查询文本中被视图定义替换时称这个视图被扩展了),并且查询优化器不再将索引化视图作为查询的某部分的替代品。如果视图使用了WITH (NOEXPAND) 说明,则不能被扩展。