SQL Server 2005 T-SQL学习笔记:CTE

概念:Common Table Expression,简称CTE,中文可以叫做,通用表表达式.

用处:处理以前版本中SQL不好现实,不好理解,复杂的查询问题.比如:分页,递归查询...

基本用法:

 

SQL Server 2005 T-SQL学习笔记:CTE WITH   < name  of  your CTE > ( < column  names > )
SQL Server 2005 T-SQL学习笔记:CTE
AS
SQL Server 2005 T-SQL学习笔记:CTE(
SQL Server 2005 T-SQL学习笔记:CTE
< actual query >
SQL Server 2005 T-SQL学习笔记:CTE)
SQL Server 2005 T-SQL学习笔记:CTE
SQL Server 2005 T-SQL学习笔记:CTE
SELECT   *   FROM   < name  of  your CTE >
SQL Server 2005 T-SQL学习笔记:CTE

 

示例一(基本用法):

 

SQL Server 2005 T-SQL学习笔记:CTE with  MyCTE(ID, Name)
SQL Server 2005 T-SQL学习笔记:CTE
as
SQL Server 2005 T-SQL学习笔记:CTE(
SQL Server 2005 T-SQL学习笔记:CTE    
select  EmployeeID  as  ID, FirstName  +   '   '   +  LastName  as  Name
SQL Server 2005 T-SQL学习笔记:CTE    
from     HumanResources.vEmployee
SQL Server 2005 T-SQL学习笔记:CTE)
SQL Server 2005 T-SQL学习笔记:CTE
select   *   from  MyCTE


 

示例二(分页):

 

SQL Server 2005 T-SQL学习笔记:CTE with  MyCTE(ID, Name, RowID)
SQL Server 2005 T-SQL学习笔记:CTE
as
SQL Server 2005 T-SQL学习笔记:CTE(
SQL Server 2005 T-SQL学习笔记:CTE    
select  EmployeeID  as  ID, FirstName  +   '   '   +  LastName  as  Name,
SQL Server 2005 T-SQL学习笔记:CTE            Row_Number() 
over  ( order   by  EmployeeID)  as  RowID
SQL Server 2005 T-SQL学习笔记:CTE    
from     HumanResources.vEmployee
SQL Server 2005 T-SQL学习笔记:CTE)
SQL Server 2005 T-SQL学习笔记:CTE
select   *   from  MyCTE  where  RowID  between   1   and   10


 

示例三(关联CTE):

 

SQL Server 2005 T-SQL学习笔记:CTE with OrderCountCTE(SalesPersonID, OrderCount)
SQL Server 2005 T-SQL学习笔记:CTE
as
SQL Server 2005 T-SQL学习笔记:CTE(
SQL Server 2005 T-SQL学习笔记:CTE    select
  SalesPersonID,  count ( 1) 
SQL Server 2005 T-SQL学习笔记:CTE    
from    Sales.SalesOrderHeader
SQL Server 2005 T-SQL学习笔记:CTE    
where     SalesPersonID  is   not   null
SQL Server 2005 T-SQL学习笔记:CTE    group
  by SalesPersonID
SQL Server 2005 T-SQL学习笔记:CTE)
SQL Server 2005 T-SQL学习笔记:CTE
select sp.SalesPersonID, sp.SalesYTD, cte.OrderCount
SQL Server 2005 T-SQL学习笔记:CTE
from  OrderCountCTE cte  inner   join  Sales.SalesPerson sp
SQL Server 2005 T-SQL学习笔记:CTE
on  cte.SalesPersonID  =  sp.SalesPersonID  order   by   3


示例四(使用CTE的删除):

 

 

SQL Server 2005 T-SQL学习笔记:CTE CREATE   TABLE  Products (
SQL Server 2005 T-SQL学习笔记:CTE  Product_ID 
int   NOT   NULL ,
SQL Server 2005 T-SQL学习笔记:CTE  Product_Name 
varchar  ( 25 ),
SQL Server 2005 T-SQL学习笔记:CTE  Price 
money   NULL ,
SQL Server 2005 T-SQL学习笔记:CTE
CONSTRAINT  PK_Products  PRIMARY   KEY   NONCLUSTERED  (Product_ID)
SQL Server 2005 T-SQL学习笔记:CTE)
SQL Server 2005 T-SQL学习笔记:CTE
GO
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 1 ' Widgets ' 25 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 2 ' Gadgets ' 50 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 3 ' Thingies ' 75 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 4 ' Whoozits ' 90 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 5 ' Whatzits ' 5 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 6 ' Gizmos ' 15 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 7 ' Widgets ' 24 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 8 ' Gizmos ' 36 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Products (Product_ID, Product_Name, Price)  VALUES  ( 9 ' Gizmos ' 36 )
SQL Server 2005 T-SQL学习笔记:CTE
GO
SQL Server 2005 T-SQL学习笔记:CTE
SQL Server 2005 T-SQL学习笔记:CTE
-- ==================Delete duplicate products=============================
SQL Server 2005 T-SQL学习笔记:CTE
with  DuplicateProdCTE
SQL Server 2005 T-SQL学习笔记:CTE
as
SQL Server 2005 T-SQL学习笔记:CTE(
select   Min (Product_ID)  as  Product_ID, Product_Name
SQL Server 2005 T-SQL学习笔记:CTE     
from     Products
SQL Server 2005 T-SQL学习笔记:CTE     
group   by  Product_Name
SQL Server 2005 T-SQL学习笔记:CTE     
having   count ( 1 > 1
SQL Server 2005 T-SQL学习笔记:CTE)
SQL Server 2005 T-SQL学习笔记:CTE
delete  Products  from  Products p  join  DuplicateProdCTE cte 
SQL Server 2005 T-SQL学习笔记:CTE
on  cte.Product_Name  =  p.Product_Name  and  p.Product_ID  >  cte.Product_ID

 

示例五(递归查询):

SQL Server 2005 T-SQL学习笔记:CTE CREATE   TABLE  Employee_Tree (Employee_NM  nvarchar ( 50 ), Employee_ID  int   PRIMARY   KEY , ReportsTo  int )
SQL Server 2005 T-SQL学习笔记:CTE
-- insert some data, build a reporting tree
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Employee_Tree  VALUES ( ' Richard ' 1 NULL )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Employee_Tree  VALUES ( ' Stephen ' 2 1 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Employee_Tree  VALUES ( ' Clemens ' 3 2 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Employee_Tree  VALUES ( ' Malek ' 4 2 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Employee_Tree  VALUES ( ' Goksin ' 5 4 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Employee_Tree  VALUES ( ' Kimberly ' 6 1 )
SQL Server 2005 T-SQL学习笔记:CTE
INSERT   INTO  Employee_Tree  VALUES ( ' Ramesh ' 7 5 )
SQL Server 2005 T-SQL学习笔记:CTE
--
SQL Server 2005 T-SQL学习笔记:CTE
with  MyCTE
SQL Server 2005 T-SQL学习笔记:CTE
as
SQL Server 2005 T-SQL学习笔记:CTE(    
select  Employee_ID, Employee_NM,  - 1   as  ReportsTo,  0   as  SubLevel
SQL Server 2005 T-SQL学习笔记:CTE    
from  Employee_Tree  where  ReportsTo  is   null   -- root node
SQL Server 2005 T-SQL学习笔记:CTE
     union   all
SQL Server 2005 T-SQL学习笔记:CTE    
select  e.Employee_ID, e.Employee_NM, e.ReportsTo, SubLevel  + 1
SQL Server 2005 T-SQL学习笔记:CTE    
from  Employee_Tree e, MyCTE  where  e.ReportsTo  =  MyCTE.Employee_ID
SQL Server 2005 T-SQL学习笔记:CTE
SQL Server 2005 T-SQL学习笔记:CTE
-- select * from MyCTE
SQL Server 2005 T-SQL学习笔记:CTE
select  MyCTE.Employee_NM  as  emp , MyCTE.SubLevel, e.Employee_NM  as  boss 
SQL Server 2005 T-SQL学习笔记:CTE
from  MyCTE  left   join  Employee_Tree e  on  MyCTE.ReportsTo  =  e.Employee_ID
SQL Server 2005 T-SQL学习笔记:CTE
-- OPTION(MAXRECURSION 3) --error
SQL Server 2005 T-SQL学习笔记:CTE--
OPTION(MAXRECURSION 4) --ok
SQL Server 2005 T-SQL学习笔记:CTE
where  SubLevel  <   4

注意:OPTION(MAXRECURSION 4)用来设置递归时查找的层数,默认是100,如果超过默认或指定的,则会报错.通常我们用一个层数列来过滤指定的层.

 

你可能感兴趣的:(sql server 2005)