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

not exist与not in的区别解决方法

2012-01-11 
not exist与not in的区别createtablet(column1intcolumn2varchar(10)column3varchar(10)column4varchar(10

not exist与not in的区别
create   table   t
(column1   int       column2   varchar(10)     column3   varchar(10)   column4   varchar(10))
insert   into   t
select   1                         'B '                   'C '                   'D '   union   all
select   2                         'B '                   'C '                   'E '   union   all
select   3                         'F '                   'F '                   'H '  

select   *   from   t   a
where   not   exists  
(select   *   from   t   where   a.column2=t.column2   and   a.column3=t.column3   and   a.column1 <t.column1)


select   *   from   t   a  
where   a.column1   not   in  
(select   column1   from   t   where   a.column2=t.column2   and   a.column3=t.column3   and   a.column1 <t.column1)
drop   table   t

谁帮测下这个SQL   第二个SQL为什么不排除第一行啊?  



[解决办法]
select *
from t a
where not exists
(select * from t
where a.column2=t.column2 and a.column1 <t.column1 )

--1 1 <2 not exists为假 (条件为 'b '=t.column2 and 1 <t.column1 )
--2 2 <??? OK (条件为 'b '=t.column2 and 2 <t.column1 )
--3 3 <?? OK (条件为 'F '=t.column2 and 3 <t.column1 )


select *
from t a
where a.column1 not in
(select column1 from t
where a.column2=t.column2 and a.column1 <t.column1)
--1 条件为 1 not in (2) -- OK 子查询条件 'b '=t.column2 amd 1 <t.column1
--2 条件为 1 not in (??) -- OK 子查询条件 'b '=t.column2 amd 2 <t.column1
--这个??不知道怎么表示,相当于一个空的数组吧
--3 同上
[解决办法]
按你的题
你可以把
not in

not exists

not in分解成
select * from t where col1 not in (....1 <1)
union all
select * from t where col1 not in (....1 <2)
union all
select * from t where col1 not in (....1 <3)

not exists 分解成
select * from t where not exsits
(select 1 <1
union all
select 1 <2
union all
select 1 <3
)


当然这只是方便理解而转化的... sql 到底是怎么处理的 偶也不清楚


[解决办法]
welove1983的说法有点出入.
---------------------------


not in
即:
where x not in
(
select statement
where
condition 1
AND
condition 2
..
AND
condition N
)

逻辑上是 "与的非 " 运算, 这个逻辑运算可转换为 "非的与 "
即 _____ _ _
A * B = A * B

而楼上的写法 UINION ALL 操作是 或操作,那么相当于是 将 与的非 转成 或了
即 _____ _ _
A * B = A U B

取条件结果的非. 比如: A{1,2,3},B{1} 在这两个集合中,A集合除掉B集合就只剩下 2,3两个元素了.



not exists
即:
where not exists
(
select statement
where
condition 1
AND
condition 2
..
AND
condition N
)
而 not exists 不是 取非运算.即并不是取条件的非.

楼主的查询:
not in的写法,当低层在主查询处理第一条记录时:

1BCD

子查询执行的是 select column1 from t where 'b '=column2 and 'c '=column3 and 1 <column1

那么在表t中 column2= 'b ' and column3= 'c ' 且 column1> 1的,是第二条, 那么此时子查询结果集增加一行column1,值为 2, 此时子查询会再往下走,但找不到符合这个条件的记录了,接着主查询下移

而 not exists的写法, 当处理第一条记录时:因为找出第二条是符合记录的,那么即exists ,子查询不会再往下看,而是退出, 接着主查询下移

用not exists还是用not in 不是看子查询条件是否一样, 而是看你的应用。 因为not exists跟 not in 本来就不同

热点排行