数据
--------------------------------(数据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
---------------------------------
这个问题在论坛里提问过,大家对每个进行了回一个复,加上在一些标准资料查询查阅后,得到了比较满意的结果
论坛中xiaowengang回复:fldcph=fldcph是一个恒等式。
所以实际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 TO_CHAR(a.starttime, 'YYYY-MM-DD HH24:MI')>'2015-11-04 13:47:00')
因此查询中得到了2条数据
实际第二个查询语句我对于别名fldcph=a.fldcph,期初是觉得也是恒等的,但实际上的结果并是这样,在论坛xiaowengang回复中,可以把fldcph=a.fldcph看成两个不同的列的比较,
但是这里之后会引申到一个新的问题当两者为null的时候会出现null=null的比较,这里对论坛回复null=null等于false,我再在网上查阅了一些资料得到了ANSISQL(SQL-92)标准中的描述
即ANSISQL(SQL-92)标准中Null值的比较取值结果都为False,既Null=Null取值也是False
因此数据数据中只有ID为B的数据可行
总结:select * from T1 a where exists (select 1 from T1 where fldcph=a.fldcph这个局行在网上都能找的到,但是实际上如果我们在查询中需要到null列的数据的fldcph=a.fldcph是不需要的
where exists (select 1 from 中null=null时遇到的实际问题
最新推荐文章于 2024-04-28 11:40:21 发布