SQL2005学习笔记 APPLY 运算符

2016-02-19 11:09 10 1 收藏

今天图老师小编要向大家分享个SQL2005学习笔记 APPLY 运算符教程,过程简单易学,相信聪明的你一定能轻松get!

【 tulaoshi.com - 编程语言 】

使用APPLY运算符可以为实现查询操作的外部表表达式返回的每个行调用表值函数。
表值函数作为右输入,外部表表达式作为左输入。
通过对右输入求值来获得左输入每一行的计算结果,生成的行被组合起来作为最终输出。
APPLY运算符生成的列的列表是左输入中的列集,后跟右输入返回的列的列表。
APPLY 运算符的左操作数和右操作数都是表表达式。
这些操作数之间的主要区别是:右操作数可以使用表值函数,从左操作数获取一个列作为函数的参数之一。左操作数可以包括表值函数,但不能以来自右操作数的列作为参数。
演示一下APPLY 运算符的用法:
代码如下:

--建一个表
CREATE TABLE MyData
(
ids INT IDENTITY PRIMARY KEY,
Data NVARCHAR(1000)
)
go
--插入测试数据
INSERT INTO MyData VALUES('')
INSERT INTO MyData VALUES('a,b,c')
INSERT INTO MyData VALUES('q')
INSERT INTO MyData VALUES('i,p')
GO
select * from MyData
go
--查询结果
ids Data
1
2 a,b,c
3 q
4 i,p

建立一个表,作用是:按逗号分解字符,分解出的每一个字符做一行数据返回
代码如下:

create FUNCTION fun_MyData(
@data AS NVARCHAR(1000)
)
RETURNS @tem TABLE( id INT , value nvarchar(100) )
AS
BEGIN
select @data=isnull(@data,'')
if len(@data)=0
return --字符长度为0 ,退出
declare @id AS INT
select @id=1
declare @end AS INT
select @end = CHARINDEX(',', @data)
while(@end0)
begin
insert into @tem(id,value)
select @id,left(@data,@end-1)
select @id=@id+1
select @data=right(@data,len(@data)-@end)
select @end = CHARINDEX(',', @data)
end
if len(@data)0
begin
insert into @tem(id,value)
select @id,@data
end
RETURN
END

开始使用APPLY 运算符:
代码如下:

SELECT m.ids, f.*
FROM MyData m CROSS APPLY fun_MyData(data) f
go
--结果
ids id value
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p
SELECT m.ids, f.*
FROM MyData m OUTER APPLY fun_MyData(data) f
go
--结果
ids id value
1 NULL NULL
2 1 a
2 2 b
2 3 c
3 1 q
4 1 i
4 2 p

我们看到OUTER APPLY返回的结果行比CROSS APPLY多。
这一点有点象inner join(内部联接)和Left Outer Join(左外部联接)之间的关系.
其实APPLY有两种形式:CROSS APPLY 和 OUTER APPLY。
CROSS APPLY仅返回外部表中通过表值函数生成结果集的行。
OUTER APPLY既返回生成结果集的行,也返回不生成结果集的行,其中表值函数生成的列中的值为 NULL。
以上是sql2005的解决方案,下面我演示一下sql2000怎么解决这样的查询:
思路是:做个循环来逐个链接查询。
代码如下:

--sql2000版本
declare @ids int
select @ids =0
declare @data nvarchar(200)
select @data=''
--定义表变量临时存放数据
declare @tem table(
ids int,
id int,
value nvarchar(100)
)
DECLARE test_cursor CURSOR FOR
SELECT ids, Data FROM MyData
OPEN test_cursor
FETCH NEXT FROM test_cursor
INTO @ids,@data
WHILE @@FETCH_STATUS = 0
begin
insert into @tem
select @ids,id,value
from dbo.fun_MyData(@data)
FETCH NEXT FROM test_cursor
INTO @ids,@data
end
CLOSE test_cursor
DEALLOCATE test_cursor
select * from @tem

同样得到了结果,但是sql2000要利用循环,这样代码复杂,计算耗时。
让我们充分利用Sql Server2005新兵器:APPLY运算符给我们带来的简便快捷的运算方式吧.

来源:http://www.tulaoshi.com/n/20160219/1596656.html

延伸阅读
标签: Web开发
JavaScript中new运算符是创建一个新对象。使用方法: new constructor[(arguments)] 其中constructor是必选项。对象的构造函数。如果构造函数没有参数,则可以省略圆括号。 arguments是可选项。任意传递给新对象构造函数的参数。 JavaScript中new运算符说明 new 运算符执行下面的任务: 创建一个没有成员的对象。 为那个对象调用构造函数...
标签: Web开发
typeof 运算符是 返回一个用来表示表达式的数据类型的字符串。 使用方法: typeof[()expression[]] ; 其中 expression 参数是需要查找类型信息的任意表达式。 JavaScript中typeof运算符说明 typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined." typ...
标签: Web开发
今天看一个JS的脚本,发现里面有一句话是这样子写的 var obj = document.getElementById("btn1") || document.getElementById("btn2"); 我觉得这个很奇怪,去查了一下||符号的意思,官方的说法是,逻辑或运算,我理解的应该是返回TRUE或FALSE吧,可以神奇的是JAVSCRIPT居然把可以找到的对象返了回来,我做了个试验,在页面上放一个按...
标签: Web开发
JavaScript中减法运算符(-)是从一个表达式的值中减去另一个表达式的值,只有一个表达式时取其相反数。使用方法: 语法 1 result = number1 - number2 语法 2 -number 其中result是任何数值变量。 number是任何数值表达式。 number1是任何数值表达式。 number2任何数值表达式。 在语法 1 中,- 运算符是算术减法运算符,用来获得两个数值...
标签: Web开发
在cssrain整理的一个 试题集 中有这么一道题: SCRIPT LANGUAGE="JavaScript" var a = 0; var b = -1; var c = 1; function assert (aVar) { if (aVar==true)     alert(true); else     alert(false); } assert(a) ; assert(b) ; assert(c) ; /SCRIPT 运行代码框 SCRIPT LANGUAGE=&...

经验教程

881

收藏

59
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部