网站首页  |   业界社区  |  电信社区  |  技术社区   |  极客社区  |  游戏社区  |  生活社区   |   科技博客  |   同事录
TechWeb-技术社区


标题: 一个有趣测试 , 不知道结果为什么是这样
本主题由 xufeng 于 2008-7-31 11:44 移动
史蒂芬
TW中级会员
Rank: 3Rank: 3


UID 117308
精华 3
积分 220
帖子 131
阅读权限 30
注册 2007-3-28
状态 离线
发表于 2008-7-28 10:19 资料 短消息 加为好友
一个有趣测试 , 不知道结果为什么是这样

/****** 对象:  Table [dbo].[ctn_type]    脚本日期: 07/10/2008 17:13:27 ******/ +L$G'_0a!p3c$`
SET ANSI_NULLS ON
+N G;T;_)B-}*]0u-sGO tech.techweb.com.cn:](R/B:U*q:n"g$Y
SET QUOTED_IDENTIFIER ON
*i$D&C:D7\7I%B3CGO #P!j5G*L!N5Q0V;e:y
SET ANSI_PADDING ON 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛9d5@&n:j(@.A9}1j9{
GO
(B"\2e$G$~CREATE TABLE [dbo].[table1]( #T4s*a g1T+y8{
[ziduan1] [char](2) COLLATE Chinese_PRC_CI_AS NOT NULL,
6R1~$o/S q+|*f l[ziduan2] [char](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
9t#F*v3z-E3D(N9HCONSTRAINT [key_ziduan1] PRIMARY KEY NONCLUSTERED '[ o"\*M)U
( 7S#C,F*y9T#n'C3b3h
[ziduan1] ASC
$_3`(n"K0q)w)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 2p:p*J"R"j)k
) ON [PRIMARY] 9}*o-V-\-Y3t
2`0z s-Y*O'j
GO tech.techweb.com.cn8z9]2E$y!M%\
SET ANSI_PADDING OFF j"s+?)i6F2o5Q(Q

6I;I#_"J-N'T%@*f9l3minsert into table1 :?(c"a9E:d"|'z/{#k
select '1','2' union all TechWeb-技术社区#e'G+t3r,y!c
select '3','7' union all 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛0I7q'Q;` y6N"I
select '4','7' union all TechWeb-技术社区-M8?-s&F"s+}$U
select '2','6'  
/h%A0A-j+`#?+ftech.techweb.com.cn
9}.v-h3y9g(Y;u!zTechWeb-技术社区4z1A&b2{2j"O-Q0[
select * from table1 tech.techweb.com.cn#R4|+x0{+Y3X!`-f
where ziduan1 in  (select ziduan1 from 任何表只要有记录就行,但是这个表没有ziduan1这个字段)
1Q"|-a#x)m2etech.techweb.com.cnTechWeb-技术社区!X4V-Z2c8m3^0V
这样就能返回table1里面所有记录
(F#M1a7V5n+i'P1F2eTechWeb-技术社区%Y+H*s;U/f,A$[;c n
这是为什么呢 ~! :N(^0b-b!i"R(@1a1{7R/g

b5`&P;H3h;\0c'ao(∩_∩)o...  当作一个测验吧  我在2000和2005里面都实验了

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:12
SQL codeselect * from table1
where ziduan1 in (select ziduan1 from sys.objects)


呵呵,还是真的诶,
不会是bug吧~
还是什么机制?

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:14
SQL code
Msg 207, Level 16, State 1, Line 18
Invalid column name 'ziduan1'.

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:18
SQL codeSET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[table1](
[ziduan1] [char](2) COLLATE Chinese_PRC_CI_AS NOT NULL,
[ziduan2] [char](10) COLLATE Chinese_PRC_CI_AS NOT NULL,
)
GO
SET ANSI_PADDING OFF
insert into table1
select '1','2' union all
select '3','7' union all
select '4','7' union all
select '2','6'  
select * from table1
where ziduan1 in  (select ziduan1 from dbo.LMST_LOCATION)
drop table table1


(4 件処理されました)

ziduan1 ziduan2   
------- ----------
1       2         
3       7         
4       7         
2       6         

(4 件処理されました)




引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:18
果然,应该是Bug吧

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:18
晕,SQL也出现这么低级的bug

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:18
IN (Transact-SQL)
http://msdn.microsoft.com/zh-cn/library/ms177682.aspx
subquery 或 expression 使用 IN 或 NOT IN 与 test_expression 比较后返回的所有空值都将返回 UNKNOWN。将空值与 IN 或 NOT IN 一起使用会产生意外结果。
------------------------
不知道是不是这个原因,
返回的是UNKNOWN类型?
将空值与 IN 或 NOT IN 一起使用会产生意外结果.
的确是比较意外~

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:19
我也是理解错了,确实是BUG,BUG是不需要解释的,微软工程师也不会解释,应该是内部编码出的问题,查看执行计划,显示成了:
  ¦--Nested Loops(Left Semi Join)
      ¦--Table Scan(OBJECT:([Test].[dbo].[T1]), WHERE:([Test].[dbo].[T1].[ID]=[Test].[dbo].[T1].[ID]))
      ¦--Table Scan(OBJECT:([Test].[dbo].[T4]))


这里的T4是不包含ID列的。

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:22
老问题了
解析条件是:[master].[dbo].[table1].[ziduan1]=[master].[dbo].[table1].[ziduan1]

因为in()里的子查询没有ziduan1列,所以sql就以为table1.ziduan1=table1.ziduan1

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:22
真的解析成了

SQL code

where [table1].[ziduan1] = [table1].[ziduan1]

那这样就应该是所有结果.

引用 回复 顶部
查看积分策略说明快速回复主题
选项 标题 Smilies
禁用 URL 识别
禁用 Smilies
禁用 Discuz!代码
使用匿名发帖
使用个人签名
接收新回复邮件通知
内容





当前时区 GMT+8, 现在时间是 2008-12-3 07:43
京ICP证060517号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2008 Comsenz Inc.
Processed in 0.030064 second(s), 9 queries

清除 Cookies - 联系我们 - TechWeb.com.cn - Archiver - WAP