关于子查询别名的问题

kiranet 2015-11-05 06:24:28
数据
--------------------------------(数据A中FLDCPH是没有数据的就是空)
ID FLDCPH STARTTIME
A 2015-11-06 15:42:52
B OXA 2015-11-05 11:26:30
---------------------------------
查询语句
select * from T1 a where exists (select 1 from T1 where fldcph=fldcph and TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')

结果
--------------------------------
ID FLDCPH STARTTIME
A 2015-11-06 15:42:52
B OXA 2015-11-05 11:26:30
---------------------------------
查询语句
select * from T1 a where exists (select 1 from T1 where fldcph=a.fldcph and TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')

结果
--------------------------------
ID FLDCPH STARTTIME
B OXA 2015-11-05 11:26:30
---------------------------------

加了别名和不加别名查询知道意思是不一样,但是不知道是什么道理
...全文
218 点赞 收藏 7
写回复
7 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Yole 2015-11-06
没别名 fldcph=fldcph 和1=1没啥区别,有别名,这两个fldcph 就不一样了;一个是子查询的一个是外面a的~~
回复
湖中仙人 2015-11-06
前面是列恒等,后面在=两边都是空,SQL里面在=两边都是空的索引
回复
Tiger_Zhao 2015-11-06
fldcph=fldcph
只要不是 NULL,自己和自己总是相等的,所以子查询总返回一条语句,所以 EXISTS 判断始终为真。
回复
kiranet 2015-11-06
引用 6 楼 Tiger_Zhao 的回复:
[Quote=引用 5 楼 u010192842 的回复:]没别名 fldcph=fldcph 和1=1没啥区别[/Quote] 有区别!如果 fldcph 值为 NULL 就是假的。
--------------------------------(数据A中FLDCPH是没有数据的就是空) ID FLDCPH STARTTIME A 2015-11-06 15:42:52 B OXA 2015-11-05 11:26:30 --------------------------------- 我子查询可能用的比较少,我综合了几位的想法,我的理解是这样当使用select * from T1 a where exists (select 1 from T1 where fldcph=fldcph and TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')的是时候这条语句等价于select * from T1 a where exists (select 1 from T1 where 1=1 and TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')可以看作为select * from T1 a where exists (select 1 from T1 where TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00'),所以这两条数据实际内查询的时候都返回true,所以得到是这两条数据 而当使用select * from T1 a where exists (select 1 from T1 where fldcph=a.fldcph and TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')的时候,套用
引用 4 楼 xiaowengang 的回复:
前面是列恒等,后面在=两边都是空,SQL里面在=两边都是空的索引
那就是此时检索数据A的时候=两边都是空,所以返回的false,结果只寻到数据B OXA 2015-11-05 11:26:30
回复
Tiger_Zhao 2015-11-06
[Quote=引用 5 楼 u010192842 的回复:]没别名 fldcph=fldcph 和1=1没啥区别[/Quote]
有区别!如果 fldcph 值为 NULL 就是假的。
回复
kiranet 2015-11-05
引用 1 楼 xiaowengang 的回复:
没a时, fldcph=fldcph 是指的括号里面的表T1;而fldcph=a.fldcph ,中的fldcph指的是括号里面的表T1,a.fldcph指的是括号外面的表TI中的字段fldcph
表外T1和表里的T1数据应该是相同的,我知道必须加上别名 但是不知道是什么原因造成了查询数据差异
回复
湖中仙人 2015-11-05
没a时, fldcph=fldcph 是指的括号里面的表T1;而fldcph=a.fldcph ,中的fldcph指的是括号里面的表T1,a.fldcph指的是括号外面的表TI中的字段fldcph
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-11-05 06:24
社区公告
暂无公告