设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 2681|回复: 8
打印 上一主题 下一主题

[查询] 【Access小品】揣测--关于TOP的阐释

[复制链接]
跳转到指定楼层
1#
发表于 2012-11-21 10:23:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 todaynew 于 2012-11-21 15:22 编辑

  版友李乐同志问为什么sql的top子句设置为5,部分查询结果超过5条记录。这个问题在前不久我在处理一个示例时遇到过,当时没有太多想。今天看到这个问题后,觉得还是有些意思,便决定深入观察一下,看看是否能找到问题所在,并对此做出一个合理的解释。于是我整了一个极为简单的数据表,并以此编写了几个查询语句,问题的原因很快就浮现出来了。
          当没有排序子句(order by)时,top语句可以按照设置的条数进行显示,当设置了排序子句后,情况就发生了变化,top对记录条数的控制有些手足无措了,它不再一定返回设定的条数。为什么会这样呢?

          萨特的存在主义哲学中有一句名言叫做:存在就是合理。从这个哲学思想出发,我们来揣测一下SQL语句如此设计的道理所在。不排序的情况下,记录按照其存储的物理位置存放,这个时候你要TOP一下记录,SQL理解你只是想按照物理位置找到前n条记录。不过结果有些诡异,可能并不是你希望要的数据。

          select top 2 * from 表1 where f1>="0" and f1<="6"

  显示出来的2和4,而不是1和2。原因就在于2和4的id分别为1和2,这是它们的存储的物理位置。

          为了得到你想要的数据,你通常会加上排序子句,将SQL语句写为:

          select top 2 * from 表1 where f1>="0" and f1<="6" order by f1

  
  奇怪的事情出现了。这时显示的是三条记录,一条记录f1的值为1,两条记录的值为2。这说明什么?说明SQL在说:“我不知道你到底想要物理位置上的哪些记录?去球!我把你可能想要的记录都给你好了。”再深入一些,为什么SQL理解为这是你可能想要的记录呢?我们来设想一个实际情况:在一场考试中有1个学生得了100分,3个学生得来98分。你想找排名前三名的学生。你希望SQL语句怎么给你结果?结论是不言而喻的。

          你可能不必去想这些道理,记住以下结论就可以了:不排序,top以记录的物理位置列出最前面的几条记录;排序,top以排序结果列出最前面的n-1条记录,如果第n条记录有相同的值则全面列出它们。







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

本帖被以下淘专辑推荐:

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖1 订阅订阅
2#
发表于 2012-11-21 11:38:14 | 只看该作者
老汉又开始高产了。
3#
发表于 2012-11-21 14:55:19 | 只看该作者
谢谢分享
4#
发表于 2012-11-21 15:52:25 | 只看该作者
谢谢老师分享!
5#
发表于 2012-11-22 08:28:39 | 只看该作者
谢谢分享
收藏了
6#
发表于 2012-11-22 09:19:02 | 只看该作者
还好我的子句是编号不会重复的,懂了
7#
发表于 2012-11-22 15:26:30 | 只看该作者
支持老汉!
8#
发表于 2012-11-22 15:57:37 | 只看该作者
{:soso_e179:}{:soso_e163:}
9#
发表于 2012-11-22 20:58:15 | 只看该作者
很有启发。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-6 21:32 , Processed in 0.098961 second(s), 36 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表