| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 798 人关注过本帖
标题:下面是网上一个学生成绩排名的代码,有几个不懂的地方请行家指教一下
只看楼主 加入收藏
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
结帖率:79.38%
收藏
已结贴  问题点数:20 回复次数:4 
下面是网上一个学生成绩排名的代码,有几个不懂的地方请行家指教一下
SELECT 语文, (SELECT COUNT(*)+1 FROM xscj.dbf WHERE a.语文< 语文) AS 语文名次 FROM xscj.dbf AS a
这是一个表本身的嵌套查询。它是怎样进行执行的?也就是解题思路如何?
1、这里a.语文< 语文中的语句的a.语文别名a是指何表的别名? 语文是指何表中的橍名?
2、为什么相同的分数只计算一次?
3、名次号为什么会不連续的?从何语句会产生这种不連续的效果?
见图
图1会原表,图2为排序后的表。请行家指教。多谢了。

图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 sylknb 于 2011-4-21 22:34 编辑 ]
搜索更多相关主题的帖子: 学生成绩 
2011-04-21 22:31
jinanshui
Rank: 2
等 级:论坛游民
帖 子:295
专家分:67
注 册:2009-10-6
收藏
得分:14 
SELECT语句的执行的逻辑查询处理步骤:

(8)SELECT (9)DISTINCT
(11)<TOP_specification> <select_list>
(1)FROM <left_table>
(3) <join_type> JOIN <right_table>
(2)  ON <join_condition>
(4)WHERE <where_condition>
(5)GROUP BY <group_by_list>
(6)WITH {CUBE | ROLLUP}
(7)HAVING <having_condition>
(10)ORDER BY <order_by_list>

每个步骤产生一个虚拟表,该虚拟表被用作下一个步骤的输入。只有最后一步生成的表返回给调用者。如

果没有某一子句,则跳过相应的步骤。

1. FROM:对FROM子句中的前两个表执行笛卡尔积,生成虚拟表VT1。

2. ON:对VT1应用ON筛选器。只有那些使<join_condition>为真的行才被插入VT2。

3. OUTER(JOIN):如果指定了OUTER JOIN,保留表中未找到匹配的行将作为外部行添加到VT2,生成VT3。

如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到

处理完所有的表为止。

4. 对VT3应用WHERE筛选器。只有使<where_condition>为TRUE的行才被插入VT4。

5. GROUP BY:按GROUP BY 子句中的列列表对VT4中的行分组,生成VT5。

6. CUBE|ROLLUP:把超组插入VT5,生成VT6。

7. HAVING:对VT6应用HAVING筛选器。只有使<having_condition>为TRUE的组才会被插入VT7。

8. SELECT:处理SELECT列表,产生VT8。

9. DISTINCT:将重复的行从VT8中移除,产生VT9。

10. ORDER BY:将VT9中的行按ORDER BY子句中的列列表排序,生成一个有表(VC10)。

11. TOP:从VC10的开始处选择指定数量或比例的行,生成表VT11,并返回给调用者。


注意:FROM xscj.dbf AS a ,产生了一个结构相同的表。a.语文就是其中的字段。我不知道理解的对不对。



[ 本帖最后由 jinanshui 于 2011-4-22 09:00 编辑 ]
2011-04-22 08:54
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
先谢了,但你所讲的与我要求的好象不太吻合。
2011-04-22 17:31
ilikeflash
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:148
专家分:186
注 册:2011-4-6
收藏
得分:0 
SELECT COUNT(*)+1 FROM xscj.dbf WHERE a.语文< 语文 这句是一个自身联接查询,,你可以想象成一个xscj表,一个叫a的表,事实上是完全相同的两个表,用a表的每条记录与xscj表的每条记录作对比,若小于xscj表中的值,则记录个数+1,最后一个分数最大的记录,因为无法满足a.语文< 语文的条件,则COUNT(*)为0,+1后,产生第一的名次。
注:a 是表别名,没有前缀的表的别名,实际是xscj.语文。
2011-04-29 00:22
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
此语句只有VFP9下可运行,VFP6下不能,要在VFP6下能行的,代码如何写?
2012-05-18 22:34
快速回复:下面是网上一个学生成绩排名的代码,有几个不懂的地方请行家指教一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027719 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved