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


标题: 一个有趣测试 , 不知道结果为什么是这样
本主题由 xufeng 于 2008-7-31 11:44 移动
游客
未注册









发表于 2008-8-19 17:27
select * from table1
where ziduan1 in  (select ziduan1 from 任何表只要有记录就行,但是这个表没有ziduan1这个字段)

是有些问题,在语法上有岐义,在此情况下,子查询上的ziduan1应该是被当作table1.ziduan1看待,所以只要子查询有记录,就会出来全部记录

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:28
相当于
select * from table1
where ziduan1 in  (select table1.ziduan1 from 任何表只要有记录就行,但是这个表没有ziduan1这个字段)

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:28
当子查询中的记录中真有ziduan1列时,就不会有问题
select * from table1
where ziduan1 in  (select table1.ziduan1 from table1 where ziduan1=1 )
就能出正确结果
将其改为

select * from table1
where ziduan1 in  (select table1.ziduan1 from table1 as a where ziduan1=1 )

就变回全部记录,因子查询中的table1已变为别名a,所以table1.ziduan1又变为外面表的记录

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:28
貌似Oracle也是如此...该探究一下了...因为这个我没遇到...

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:28
这种情况下,字段列表最好显式指定表名,避免理解错误.

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:29
select * from tb a where exists(select 1 from tb where id=a.id)
一样的道理。
子查询中id未指名前辍,那么使用了子中tb的列,因为 a.id将它区别开了。

反之
select * from tb where exists(select 1 from tb a where id=a.id)
又恰相反

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:29
select * from table1
where ziduan1 in  (ziduan1)

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:29
select * from table1 where 1 in (1)

select * from table2 where 2 in (1)

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:30
麻烦了,换了个两个表都没有的字段,查询还停不下来了,取消不了。

引用 回复 顶部
游客
未注册









发表于 2008-8-19 17:30
刚才明明出现问题了,现在查又没问题了,
不是bug,因为子查询中可以引用主查询中的内容,子查询的表没有ziduan1 就引用了主查询的ziduan1 ,就是前面说的相当于1=1

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





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

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

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