首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

被遗忘的SQLServer比较运算符谓词解决方案

2012-02-01 
被遗忘的SQLServer比较运算符谓词SQLServer中有三个关键字可以修改比较运算符:All、Any和Some,其中Some和An

被遗忘的SQLServer比较运算符谓词
SQLServer中有三个关键字可以修改比较运算符:All、Any和Some,其中Some和Any等价。

官方的参考文档

http://technet.microsoft.com/zh-cn/library/ms187074%28SQL.90%29.aspx

他们作用于比较运算符和子查询之间,作用类似Exists、not exists、in、not in以及其他逻辑意义,这些语法同样被SQLServer2000支持但是很少看到有人用它们。

SQL code
set  nocount  onuse tempdbgoif (object_id ('t1' ) is not null ) drop table t1create table t1 (n int )insert into t1 select 2 union select 3  if (object_id ('t2' ) is not null ) drop table t2create table t2 (n int )insert into t2 select 1 union select 2 union select 3 union select 4select * from t2 where n> all (select n from t1 )    --4select * from t2 where n> any (select n from t1 )    --3,4--select * from t2 where n>some(select n from t1)    --3,4select * from t2 where n= all (select n from t1 )    --无数据select * from t2 where n= any (select n from t1 )    --2,3--select * from t2 where n=some(select n from t1) --2,3select * from t2 where n< all (select n from t1 )    --1select * from t2 where n< any (select n from t1 )    --1,2--select * from t2 where n<some(select n from t1)    --1,2select * from t2 where n<> all (select n from t1 )    --1,4select * from t2 where n<> any (select n from t1 )    --1,2,3,4--select * from t2 where n<>some(select n from t1)--1,2,3,4set nocount off 


注意,如果t1中包含null数据,那么所有All相关的比较运算将不会返回任何结果,原因就不用多解释了。而因为t1和t2表的null的存在他们和not exists之类的比较符会有一些区别。

比如下面两句

select * from t2 a where not exists(select 1 from t1 where n>=a.n)

select * from t2 where n >all(select n from t1)

他们逻辑上意义很像但是对于null的处理却是恰恰相反,第一句会忽略子查询的null而把t2的null同时查出来,第二句却是忽略了t2的null同时会因为t1中的null而无法查询到数据。

[解决办法]
学习
[解决办法]
学习
[解决办法]
学习
[解决办法]
MARK
[解决办法]
学习.
[解决办法]
第一次看到有人用
[解决办法]
这几个关键词效率如何?
[解决办法]
收藏
[解决办法]
xx
[解决办法]
使劲顶剪剪
[解决办法]
探讨
select * from t2 where n <> any (select n from t1 )

这个逻辑比较绕脑子-_-|||

[解决办法]
study
[解决办法]
学习。
[解决办法]
收藏。。
[解决办法]
路过顶
[解决办法]
a
[解决办法]
學習.
[解决办法]
探讨
使劲顶剪剪

[解决办法]
好啊好啊,,,有份给么???
[解决办法]

SQL code
set  nocount  onuse tempdbgoif (object_id ('t1' ) is not null ) drop table t1create table t1 (n int )insert into t1 select 2 union select 3 go 1000 if (object_id ('t2' ) is not null ) drop table t2create table t2 (n int )insert into t2 select 1 union select 2 union select 3 union select 4go 1000CREATE INDEX COL_T1_N ON T1(N)CREATE INDEX COL_T2_N ON T2(N)set   statistics   time   onselect * from t2 where n> all (select n from t1 )    --4SELECT * FROM T2 WHERE NOT EXISTS(SELECT 1 FROM T1 WHERE T1.N>=T2.N)select * from t2 where n> any (select n from t1 )    --3,4SELECT * FROM T2 WHERE  EXISTS(SELECT 1 FROM T1 WHERE T2.N>T1.N)--select * from t2 where n>some(select n from t1)    --3,4
[解决办法]
都是高人啊 ,俺也来学习下

[解决办法]
学习了,没用过
[解决办法]
学习
[解决办法]
复习下
[解决办法]
学习了 …………………………………………………………
[解决办法]
学习
[解决办法]
向你学习
[解决办法]
多学习
[解决办法]
.
[解决办法]
mark
[解决办法]
tutyjj
[解决办法]
书上有看到了,呵呵
[解决办法]
确实很少乃至.
以至我第一次听说 .
[解决办法]
学习
[解决办法]
mark
[解决办法]
学习
[解决办法]
只在书上看到有
很少用
[解决办法]
个别用法在实际开发中较少用到
[解决办法]
这几个谓词都比较绕
[解决办法]
第一次看到,我的基本国外的SQL书里怎么也没介绍过呢?
[解决办法]
顶了再说
[解决办法]
钉下,, 看看有没有积分
[解决办法]
这个可以有
这个真的没有
[解决办法]
顶 !
[解决办法]
只在书上看到有
很少用
[解决办法]
mark.
------解决方案--------------------



[解决办法]
学习
[解决办法]
楼主好人,学习了
[解决办法]
谢谢楼主 学习了
[解决办法]
用力顶JJ
[解决办法]
学习
[解决办法]
学习
[解决办法]
学习了
[解决办法]
被遗忘是因为没有生命力还是因为我们水平没有达到?
[解决办法]
en 。。学习.
[解决办法]
没用过,打个标记。
[解决办法]
确实用得少
[解决办法]
呃,这个学过。出来后还真没看见多少人用。
像这么查询的速度有点问题,印象中。
any all 都需要遍历数据库,假如数据库大了?那么速度会怎样。
[解决办法]
嗯,我也是基本上没用过
[解决办法]

探讨
使劲顶剪剪

[解决办法]
学习学习学习
[解决办法]
学习
[解决办法]
mark
[解决办法]
xuexi
[解决办法]
study
[解决办法]
一个 not exists 就可以包打天下所有逻辑运算了。all、any、in等都可以用它来写。
[解决办法]
其实语法很简单的,意思也很容易理解,两者最主要的区别:对null的处理

[解决办法]
沙发
[解决办法]
好好学习!
[解决办法]
up
[解决办法]
探讨
使劲顶剪剪

[解决办法]
xx
[解决办法]
学习了,能告诉他们的效率如何
[解决办法]
学习
[解决办法]
学习了
[解决办法]
学习
[解决办法]
学习下先,MARK
[解决办法]
第一次见到
[解决办法]
顶一个
------解决方案--------------------


顶啊顶 JFJF
[解决办法]
学习了
[解决办法]
mark 学习
[解决办法]

[解决办法]
学习了
[解决办法]
mark & study

热点排行