CTE(Common Table Expressions)简单介绍(一)

上星期去上了个公开课,关于CTE(Common Table Expressions)。

CTE在MSSQL 2005的时候已经出现。当然,不是MSSQL的特有的,在Oracle里也有。

CTE是在SQL语句里定义一个临时的数据集,然后在跟着的SQL语句里面使用。

一下是一个简单的例子:

With test_cte As
(
   Select * From abc
)
Select * From test_cte

例子里,With就是CTE的定义语句,test_cte就是那个临时的数据集。在定义后,在跟着的SQL语句里就能直接使用。

如上面的例子。其实就等价于:

Select * From abc

当然,这不是CTE出生的原因。这个只是一个简单的例子去说明而已。

CTE能把多次调用的子句简化,让SQL语句看起来容易理解点,但是对性能没有任何的提高。性能和原来的一样。

 

展开阅读全文

CTE (Common Table Expressions) 切割 string

11-17

在数据库操作中,经常需要把一个大的字符串分割成若干小的字符串。相比利用临时表的方法,用CTE的Recursive特性可以以很高的效率切割字符串。rnrn下面是我写的一个UDF利用CTE 切割字符串的。rn[code=SQL]rnCREATE FUNCTION StrSplit(@s NVARCHAR(4000), @sep NVARCHAR(5)) rnRETURNS TABLE AS rnRETURN (rn WITH StrPieces(RowID, start, stop) AS ( SELECT 1, 1, CHARINDEX(@sep, @s) rnUNION ALL SELECT RowID + 1, stop + len(@sep), CHARINDEX(@sep, @s, stop + len(@sep)) FROM StrPieces WHERE stop > 0 ) rnSELECT RowID, rnSUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 4000 END) as Substr FROM StrPieces rn)rnrn[/code]rn来看看下面一个例子:rn[code=SQL]rnselect * from StrSplit( rnN'记者13日从国家发展改革委获悉,为应对我国强降雪天气对市场物价的影响,国家发展改革委近期发出通知',rnN',')rn[/code]rn其运行结果为:rn[code=SQL]rnRowID Substrrn1 记者13日从国家发展改革委获悉rn2 为应对我国强降雪天气对市场物价的影响rn3 国家发展改革委近期发出通知rn[/code]rn需要注意的一个问题是,SqlServer默认的Recursive Level是100,如果你要切割的字符串包含超过101个子串的, 在调用这个函数的时候需要加一个QueryHint. 比如说包含两百个以内子串,那么调用这个UDF如下:rn[code=SQL]rnselect * from StrSplit( rnN'记者13日从国家发展改革委获悉,为应对我国强降雪天气对市场物价的影响,国家发展改革委近期发出通知',rnN',') rnoption( MAXRECURSION 200)rn[/code] 论坛

没有更多推荐了,返回首页