同样的命令VFP6能用,VFP9不能用,如何解决

yun_c_sdn 2011-03-12 11:31:12
要求:取A表中所有字段,条件为按a字段进行分类汇总
语句: select * from A group by a into dbf b

这个语句VFP6可以顺利执行且取出的数据正确,VFP9无法执行,报错“sql:group by 子句缺少或无效。”
...全文
412 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ilikefox 2011-03-14
  • 打赏
  • 举报
回复
要求:取A表中所有字段,条件为按a字段进行分类汇总
语句: select * from A group by a into dbf b

首先,上面语句完全没有分类汇总的意义,因为没有任何聚合函数或计算表达式出现;要求也是含糊不清,汇总什么?求和还是平均还是统计还是其它?

6.0的group by本身就是个有毛病的东西,它对无意义的分类汇总也照样执行,当然结果也是无意义的结果。因此9.0才改进了,变得更加符合SQL标准。

举个例子,简单的成绩表(成绩表.dbf)
学号 姓名 性别 成绩
001 张三 男 89
002 李四 男 90
003 王五 女 90
004 赵六 男 87
005 吴七 女 93

按性别分类汇总,看看男女生平均成绩如何
SELECT 性别,AVG(成绩) as 平均成绩 FROM 成绩表 GROUP BY 性别
得到

性别 平均成绩
男 88
女 91

很好,这个要求以及对应的命令6.0和9.0都正确

再来
SELECT * FROM 成绩表 GROUP BY 性别

这个命令有意义吗?6.0得到

学号 姓名 性别 成绩
004 赵六 男 87
005 吴七 女 93

上面结果有汇总的意义吗?按性别分类仅有“男”、“女”两类,结果中每一类得到一条记录,而命令又要其它字段也有,6.0干脆把每一类的最后那个记录的数据填充进去,于是得到上面的结果。

9.0就不错,这个命令拒绝执行了,呵呵。
当然考虑到向下兼容,提供一个Set Enginebehavior 70命令,让9.0长叹一声:"TMD,还是按老版本的方式来处理"。
wwwwb 2011-03-14
  • 打赏
  • 举报
回复
最好使用标准的SQL语句
Set Enginebehavior 70
jxjdzwang5555 2011-03-14
  • 打赏
  • 举报
回复
分组是作什么用?如果是取全部字段,就不需要分组。
select * from A into dbf b 或者
select (将字段一一列出看能否正常运行) from A group by a into dbf b



狂龙骄子 2011-03-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 darkhawlk 的回复:]好像后面用GROUP BY时,前面SELECT子句不可以用*,只能显示分组的列和相应统计信息。...[/Quote]

正解!
十月鹰飞 2011-03-12
  • 打赏
  • 举报
回复
好像后面用GROUP BY时,前面SELECT子句不可以用*,只能显示分组的列和相应统计信息。这一点是VFP9新加的限制。可能是保证数据的一致性吧。换成select a,count(*) sum(a) from d.dbf group by a
xilaianzxsc 2011-03-12
  • 打赏
  • 举报
回复
select * from 表名 order by 表名.字段名 into table 目标表名

将楼主的group 改成 order
xilaianzxsc 2011-03-12
  • 打赏
  • 举报
回复
select * from 表名 order by 表名.字段名 into table 目标表名

xilaianzxsc 2011-03-12
  • 打赏
  • 举报
回复
from A
group by a

这二个a,

会不会出错?
taohua300 2011-03-12
  • 打赏
  • 举报
回复
执行这条语句前,先运行
Set Enginebehavior 70

sys(3099,70)

2,748

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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