当前位置:  数据库>sqlserver
本页文章导读:
    ▪SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL      转自:李宁的极客世界先看下面一个嵌套的查询语句:select * from person.StateProvince where CountryRegionCode in (select CountryRegionCode from person.CountryRegion where Name like 'C%')     上面.........
    ▪SQL with as      with temp as(select *From tb_order where Auditing=2 and AuditingTime>='2013-04-01' and Flag=2)select *from temp where EbayAccountID=21相当于临时表 temp 分析器可以智能提示 临时表却不能。 临时表select * into #temp From .........
    ▪DatabaseDesign数据库设计      1、数据库设计的3大范式(1)第一范式:数据表中的每一个列不能再分割(2)第二范式:数据表中的每一行必须唯一标识(在满足第一范式的前提下)(3)第三范式:数据表中的列不允许包.........

[1]SQL Server2005杂谈(1):使用公用表表达式(CTE)简化嵌套SQL
    来源:    发布时间: 2013-10-29

转自:


李宁的极客世界

先看下面一个嵌套的查询语句:




select * from person.StateProvince where CountryRegionCode in 
(select CountryRegionCode from person.CountryRegion where Name like 'C%')


 



    上面的查询语句使用了一个子查询。虽然这条SQL语句并不复杂,但如果嵌套的层次过多,会使SQL语句非常难以阅读和维护。因此,也可以使用表变量的方式来解决这个问题,SQL语句如下:




declare @t table(CountryRegionCode nvarchar(3))
insert into @t(CountryRegionCode) (select CountryRegionCode from person.CountryRegion where Name like 'C%')

select * from person.StateProvince where CountryRegionCode
in (select * from @t)



 


    虽然上面的SQL语句要比第一种方式更复杂,但却将子查询放在了表变量@t中,这样做将使SQL语句更容易维护,但又会带来另一个问题,就是性能的损失。由于表变量实际上使用了临时表,从而增加了额外的I/O开销,因此,表变量的方式并不太适合数据量大且频繁查询的情况。为此,在SQL Server 2005中提供了另外一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性,同时,CTE要比表变量的效率高得多。


    下面是CTE的语法:




[ WITH <common_table_expression> [ ,n ] ]
<common_table_expression>::=
expression_name [ ( column_name [ ,n ] ) ]
AS
( CTE_query_definition )


 



 


    现在使用CTE来解决上面的问题,SQL语句如下:




with
cr as
(
select CountryRegionCode from person.CountryRegion where Name like 'C%'
)

select * from person.StateProvince where CountryRegionCode in (select * from cr)


 



 


    其中cr是一个公用表表达式,该表达式在使用上与表变量类似,只是SQL Server 2005在处理公用表表达式的方式上有所不同。


    在使用CTE时应注意如下几点:
1. CTE后面必须直接跟使用CTE的SQL语句(如select、insert、update等),否则,CTE将失效。如下面的SQL语句将无法正常使用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中间用逗号(,)分隔,如下面的SQL语句所示:




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
    
[2]SQL with as
    来源:    发布时间: 2013-10-29

with temp as(

select *From tb_order where Auditing=2 and AuditingTime>='2013-04-01' and Flag=2
)
select *from temp where EbayAccountID=21
相当于临时表 temp 分析器可以智能提示 临时表却不能。

 临时表

select * into #temp From tb_order where Auditing=2 and AuditingTime>='2013-04-01' and Flag=2

select * From #temp where EbayAccountID=21



declare @flag int=2;
with temp as(

select *From tb_order where Auditing=2 and AuditingTime>='2013-04-01' and Flag=@flag
)
select *from temp where EbayAccountID=21
declare @flag int=2; 这里的分号不可少 否则会报错
关键字 'with' 附近有语法错误。如果此语句是公用表表达式、xmlnamespaces 子句或者更改跟踪上下文子句,那么前一个语句必须以分号结尾。

本文链接


    
[3]DatabaseDesign数据库设计
    来源:    发布时间: 2013-10-29

1、数据库设计的3大范式

(1)第一范式:数据表中的每一个列不能再分割
(2)第二范式:数据表中的每一行必须唯一标识(在满足第一范式的前提下)
(3)第三范式:数据表中的列不允许包含其它表的列(在满足第二范式的前提下)
 
2、数据库设计的步骤
(1)需求分析
(2)概念设计:画ER图
(3)逻辑设计:用PowerDesigner设计数据库
(4)物理设计:将用PowerDesigner设计好的pdm生成sql,创建数据库物理结构
(5)验证设计
(6)运行维护设计

本文链接


    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3