关于子查询别名的问题

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
---------------------------------

加了别名和不加别名查询知道意思是不一样,但是不知道是什么道理
...全文
341 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
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

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧