日期:2014-05-19  浏览次数:20471 次

not in 的执行问题!感觉很奇怪!!!
--测试
create   table   a
(
a1   int,
a2   int
)

create   table   b
(
b1   int,
b2   int
)

insert   into   a   select   1,11
insert   into   a   select   2,12

insert   into   b   select   1,31
insert   into   b   select   3,32

--这样写竟然没有错误提示!!!
select   *   from   a
where   a1   not   in   (select   a1   from   b)

为什么呢?

------解决方案--------------------
呵呵,
------解决方案--------------------
可能是子查询中的列明一旦与表明没关系,就被当作与其对应的那个表里的列
select * from a
where a1 in (select a1 from b)

select * from a
where a1 in (select a1)
结果都是
-----------------
1 11
2 12

------解决方案--------------------

select * from a
where a1 in (a1)
结果也是
-----------
1 11
2 12
------解决方案--------------------
?????
------解决方案--------------------
我运行结果是空,没有返回任何记录
------解决方案--------------------
为什么要报错?
------解决方案--------------------
有意思
------解决方案--------------------
看出来了。。这样都行。。
------解决方案--------------------
ms的东西需要理由吗。。。
------解决方案--------------------
有意思,为什么呢
------解决方案--------------------
select * from a
where a1 in (select a1 from b)

select * from a
where a1 in (select a1)

select * from a
where a1 in (a1)
结果都是
-----------
1 11
2 12

大胆猜测:

可能是子查询(select a1 from b)中的列名(a1)一旦与字查询中的表名(b)没有对应关系,
那么,这个列(a1)就被当作与其对应的那个表(a)里的列来处理,
所以才得到这个a中的所有记录
相当于:
select * from a
where a1 in (select a1 from a)

------解决方案--------------------
给微软打电话~:)
------解决方案--------------------
create table a
(
a1 int,
a2 int
)

create table b
(
b1 int,
b2 int
)

insert into a select 1,11
insert into a select 2,12

insert into b select 1,31
insert into b select 3,32

--这样写竟然没有错误提示!!!
select * from a
where a1 not in (select b1 from b)
------解决方案--------------------
楼上的。。。
------解决方案--------------------
呵呵。。。
------解决方案--------------------
生活太平静了
------解决方案--------------------
我宁可相信这是一个bug
------解决方案--------------------
select * from a
where a1 not in (select a1 from b)

------
where 子句是个永真式吧
狼兄。。。。
------解决方案--------------------