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

not in 的执行有关问题!感觉很奇怪!

2012-01-09 
not in 的执行问题!感觉很奇怪!!!--测试createtablea(a1int,a2int)createtableb(b1int,b2int)insertintoas

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 子句是个永真式吧
狼兄。。。。
------解决方案--------------------


select * from a
where a1 not in (select a1 from b)
--------------------------------------------
应该是子查询默认与基本建立关联,所以不会出错.
[解决办法]
select * from #a
where a1 = (select top 1 a1 from #b)
---------------
我认为这是sqlserver的bug,无论如何,这条语句也不应该输出全部记录呀?绝对不应该.
请大家继续讨论这个问题.
[解决办法]
select * from #a
where a1 not in (select a1 from #b)

如果你的B表中无A1字段,则相当于

select * from #a
where a1 not in (select #a.a1 from #b)


如果你的B表中也有A1字段 则相当于
select * from #a
where a1 not in (select #b.a1 from #b)

你就把A1想象成一个变量

如果在子查询和父查询中这个变量定义了两次,又没有指明,那就用子查询作用域里的,否则用父查询作用域;里的
[解决办法]
GOOD QUESTION!

好好看看!
[解决办法]
我理解
select * from a
where a1 not in (select a1 from b)
被解释成
select a.* from a
where a.a1 not in (select a.a1 from b)

所以没错误,但是不返回记录


[解决办法]
hillhx(曾经的曾经)
已经说过了


看查询计划可以看出

[解决办法]
我也看了执行计划,执行的是left semi join 跟exists 查询计划差不多.
即然是join 那只要列名不超出两表列名就可以了.
[解决办法]
如果结果返回
1 11
2 12
估计是SQL SERVER的容错能力
select a1 from b运行出错误后,
外层select * from a where a1 not in()认为既然错误那么select a1 from b运行后返回的数据集肯定为NULL,这样就在语意上解释通了。
在a中加一项null,13看看

[解决办法]
hillhx(曾经的曾经) 说的有道理,学习了.

[解决办法]
有意思.不知道是微软故意不是?
[解决办法]
建议狼兄把你这贴子贴到 微软的 sql 社区去!
[解决办法]
不明白

[解决办法]
select * from a a where a1 in(select b.a1 from b b)
----这是他想要的错误~~
select * from a a where a1 in(select b.a1 from b b)
和 select * from a where a1 in(select a1 from b) 好像是一样的...


[解决办法]
select * from a a where a1 in(select a.a1 from b b)
和 select * from a where a1 in(select a1 from b) 好像是一样的...
------------------汗
[解决办法]

有没有人用oracle来试试,是不是也这样的结果???
[解决办法]
有没有人用oracle来试试,是不是也这样的结果???
-------------------
是的,db2,oracle的都试一下
[解决办法]
SQL> insert into a select 1,11 from dual;

1 row created.

SQL> insert into a select 2,12 from dual;

1 row created.

SQL> insert into b select 1,31 from dual
2 union all
3 select 3,32 from dual;

2 rows created.

SQL> select * from a where a1 not in(select a1 from b);

no rows selected
[解决办法]
Oracle的也一样,只是没返回结果


[解决办法]
谢谢hyrongg(视爱情为奢侈品)测试
看来都是一样的啦...

热点排行