取结束时间为null或有具体时间的语句(疑问)

never_give_up520 2009-04-25 12:29:13
表内容如下
ID groupid start end dept
1 222 2001-1-1 2002-3-4 海云天有限公司
2 222 2002-4-5 null 碧海青天软件公司
3 5566 2004-5-6 2006-4-4 XX某公司
4 5566 2006-4-5 2009-4-4 xxxx工厂


以groupid为唯一记录,求出end字段最大的时间,如果有null就是最大,如果没有则以时间为准.
正常应反回
2 222 null 碧海青天软件公司
4 5566 2009-4-4 xxxx工厂

昨晚经高手指点正确如下
SELECT * FROM tablename a
WHERE NOT EXISTS
(
SELECT * FROM tablename
WHERE groupid=a.groupid
AND isnull(enddate,'9999-12-31')> a.enddate
)


...全文
135 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangqidong 2009-04-25
  • 打赏
  • 举报
回复
ok
对于第一条记录 1 222 2001-1-1 2002-3-4 海云天有限公司 来说
在子查询里面可以发现 第二条记录groupid 与它相同,并且这条记录isnull(enddate,'9999-12-31')> 第一条记录的enddate 也成立,
所以子查询能查出一行记录,所以not exist不成立,所以第一条记录不成立

对于第二条记录 2 222 2002-4-5 null 碧海青天软件公司 来说
在子查询里面可以发现 groupid 与它相同只有第一条记录,但是这条记录isnull(enddate,'9999-12-31')> 第二条记录的enddate 明显不成立,
所以子查询没有返回记录,所以not exist成立,所以第二条记录成立

其余类推
never_give_up520 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yangqidong 的回复:]
“end字段最大的时间,如果有null就是最大”
isnull(enddate,'9999-12-31')意思就是
当enddate是null时,把它当作一个最大日期'9999-12-31'
当不是null的时候,保持原来的值
[/Quote]
这都好理解,就是isnull(enddate,'9999-12-31')> a.enddate 这句不理解,如果是null它也大于后面那个时间,条件为true也不应该显示出来呀.可是结果为什么又是正确的还是我想要的.不太理解了.
never_give_up520 2009-04-25
  • 打赏
  • 举报
回复
SELECT * FROM tablename a
WHERE NOT EXISTS
(
SELECT * FROM tablename
WHERE groupid=a.groupid
AND dept='海云天有限公司'
)
返回
2 222 2002-4-5 null 碧海青天软件公司
3 5566 2004-5-6 2006-4-4 XX某公司
4 5566 2006-4-5 2009-4-4 xxxx工厂
像这样的很容易理解,但是像
SELECT * FROM tablename a
WHERE NOT EXISTS
(
SELECT * FROM tablename
WHERE groupid=a.groupid
AND isnull(enddate,'9999-12-31')> a.enddate
)
我确定不太明白.
yangqidong 2009-04-25
  • 打赏
  • 举报
回复
“end字段最大的时间,如果有null就是最大”
isnull(enddate,'9999-12-31')意思就是
当enddate是null时,把它当作一个最大日期'9999-12-31'
当不是null的时候,保持原来的值
never_give_up520 2009-04-25
  • 打赏
  • 举报
回复
虽然问题已经解答,但我很想搞清楚isnull(enddate,'9999-12-31')> a.enddate 这句与not exists,我理解是显示不存在大于enddate的记录.但结果确是我想要的,我开始迷糊对not exists的理解了.请高手指点!
never_give_up520 2009-04-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yangqidong 的回复:]
ok
对于第一条记录 1 222 2001-1-1 2002-3-4 海云天有限公司 来说
在子查询里面可以发现 第二条记录groupid 与它相同,并且这条记录isnull(enddate,'9999-12-31')> 第一条记录的enddate 也成立,
所以子查询能查出一行记录,所以not exist不成立,所以第一条记录不成立

对于第二条记录 2 222 2002-4-5 null 碧海青天软件公司 来说
在子查询里面可以发现 groupid 与它相同只…
[/Quote]
万分感谢!

62,268

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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