| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1569 人关注过本帖
标题:vfp9下select 列名中如果含有聚合函数时,但不要分组查询,为什么
只看楼主 加入收藏
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:10 
也可以写成这样:SELECT * FROM Ls WHERE 平均分=(SELECT MAX(平均分) FROM Ls)
2015-05-12 15:00
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
以下是引用taifu945在2015-5-12 14:58:40的发言:

子查询得出最大平均分值,父查询列出与最大平均分值有相同值的全部记录。
SELECT a.* FROM ls a,(SELECT max(平均分) as 平均分 FROM ls) b WHERE a.平均分=b.平均分
子查询得出最大平均分值,父查询列出与最大平均分值有相同值的全部记录。
我根据上述的含义:
把上述一条命令分二条
第一条:select * from ls
第二条是把子查询单独生成b库:SELECT max(平均分) as 平均分 FROM ls  b
然后把ls库与b库联接 select * from ls,b where ls.平均分=b.平均分。为什么还没有找出?出来的全部记录了
为什么分步走,二库关联不对?

[ 本帖最后由 sylknb 于 2015-5-12 15:41 编辑 ]
2015-05-12 15:26
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:191
帖 子:3147
专家分:8408
注 册:2015-3-25
收藏
得分:0 
SELECT a.* FROM ls a,(SELECT max(平均分) as 平均分 FROM ls) b WHERE a.平均分=b.平均分
能不能等同
SELECT * FROM ls WHERE 平均分 IN (SELECT max(平均分) as 平均分 FROM ls) &&我没测试,不知道是不是这样
如果等同,2个语句,那个比较好? 区别在那里
 
2015-05-12 16:03
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册

select name,xm,max(平均分) from ls
此命令在VFP9不能运行,但虽然在vfp6下能运行,可不是正确答案,此人的平均分为0分。看来此命令是有缺陷的。


[ 本帖最后由 sylknb 于 2015-5-12 16:29 编辑 ]
2015-05-12 16:10
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
以下是引用mywisdom88在2015-5-12 16:03:30的发言:

SELECT a.* FROM ls a,(SELECT max(平均分) as 平均分 FROM ls) b WHERE a.平均分=b.平均分
能不能等同
SELECT * FROM ls WHERE 平均分 IN (SELECT max(平均分) as 平均分 FROM ls) &&我没测试,不知道是不是这样
如果等同,2个语句,那个比较好? 区别在那里
 
上述二条都能出来正确的结果,第一条只能在VFP9下,第二条VFP9,VFP6下均能运行。
图片附件: 游客没有浏览图片的权限,请 登录注册
2015-05-12 16:13
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sylknb在2015-5-12 15:26:04的发言:

SELECT a.* FROM ls a,(SELECT max(平均分) as 平均分 FROM ls) b WHERE a.平均分=b.平均分
子查询得出最大平均分值,父查询列出与最大平均分值有相同值的全部记录。
我根据上述的含义:把上述一条命令分二条
第一条:select * from ls
第二条是把子查询单独生成b库:SELECT max(平均分) as 平均分 FROM ls  b
然后把ls库与b库联接 select * from ls,b where ls.平均分=b.平均分。为什么还没有找出?出来的全部记录了
为什么分步走,二库关联不对?
你仔细看看红色部分和蓝色部分:红色部分:是一个表达式,你并没有指定这个表达式的名字叫“平均分”,所以该表达式有个默认的名字,但肯定不是“平均分”;蓝色部分,你说单独生成B库(表文件)。但你在蓝色部分的表达中是告诉FoxPro,查询Ls表时,用“b”作为其别名,而不是把查询结果生成B表。这个情况说明你对SELECT-SQL语句的基本语法都没掌握好。由于上述两个原因,导致你最后一条命令无法实现你的预期。
2015-05-13 07:58
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sylknb在2015-5-12 16:10:41的发言:

 
select name,xm,max(平均分) from ls
此命令在VFP9不能运行,但虽然在vfp6下能运行,可不是正确答案,此人的平均分为0分。看来此命令是有缺陷的。
所以呀,我很反对动不动就把SELECT-SQL命令设成兼容。我早在论坛里说过,FoxPro 6.0虽然对含有聚集函数的命令不要求一定分组,但同时,查询出的结果也不一定就是正确的。
2015-05-13 08:00
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用mywisdom88在2015-5-12 16:03:30的发言:

SELECT a.* FROM ls a,(SELECT max(平均分) as 平均分 FROM ls) b WHERE a.平均分=b.平均分
能不能等同
SELECT * FROM ls WHERE 平均分 IN (SELECT max(平均分) as 平均分 FROM ls) &&我没测试,不知道是不是这样
如果等同,2个语句,那个比较好? 区别在那里
 
结果都一样,一定要说哪个好的话,肯定是后者好一些。原因很简单,前者需要建立两表联接,记录数多的话可能会影响效率;而后者的两个查询互相不关联,效果相对高。
2015-05-13 08:03
sylknb
Rank: 4
等 级:贵宾
威 望:14
帖 子:1547
专家分:184
注 册:2006-6-3
收藏
得分:0 
以下是引用taifu945在2015-5-13 07:58:51的发言:

你仔细看看红色部分和蓝色部分:红色部分:是一个表达式,你并没有指定这个表达式的名字叫“平均分”,所以该表达式有个默认的名字,但肯定不是“平均分”;蓝色部分,你说单独生成B库(表文件)。但你在蓝色部分的表达中是告诉FoxPro,查询Ls表时,用“b”作为其别名,而不是把查询结果生成B表。这个情况说明你对SELECT-SQL语句的基本语法都没掌握好。由于上述两个原因,导致你最后一条命令无法实现你的预期。
我写错了:
应是:SELECT max(平均分) as 平均分 FROM ls into table b
   select a.* from ls as a,b where a.平均分=b.平均分
2015-05-13 08:48
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
以下是引用sylknb在2015-5-13 08:48:23的发言:

我写错了:
应是:SELECT max(平均分) as 平均分 FROM ls into table b
   select a.* from ls as a,b where a.平均分=b.平均分
从语法上说,这条命令没错。如果不能出正确结果,原因很可能是这个新表的名称“b”。我不太赞成用一个字母去命名,因为A-J被FoxPro内部征用了。虽然有时候用用会如你所愿,但不总是这样。
2015-05-13 10:32
快速回复:vfp9下select 列名中如果含有聚合函数时,但不要分组查询,为什么
数据加载中...
 
   



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

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