以下是引用jiguanqiang8在2013-2-13 22:01:36的发言:
那帮我看看一下句子在6.0运行正常,9.0怎么改,谢谢了
select 品种,nvl(sum(存量),0) as 期初 from main into cursor tabchu group by 品种 where bianhao=(select max(bianhao) from main group by 罐号 where 日期<=mydate1)
问题出在我颜色标出来的两个地方:
(1)红色部分必须放在整个语句的最后。虽然FOXPRO所有版本的各命令子句(除了命令字/词本身)都可以随意安排顺序,但在某些语句中还是有顺序讲究的。比如:SELECT-SQL。它就要求ORDER BY子句必须放在除了INTO/TO子句外的最后,也就是如果含INTO/TO子句,则ORDER BY必须是倒数第二个;若无,则ORDER BY必须是最后一个子句。且ORDER BY在整个SELECT-SQL语句中(不含子查询)只能有一个,若用UNION子句联合多个SELECT查询,则ORDER BY必须只能出现在最后一个SELECT语句中。而对于INTO/TO子句而言,必须放在整个SELECT-SQL语句的最后,不能穿插在当中。你这个案例中,把INTO子句放在了GROUP BY和WHERE子句的前面,显然是错误的。即使没有子查询中的错误,这条语句还是不能执行。
(2)很多人对于什么时候用GROUP BY子句搞不清楚。GROUP BY子句一般用在输出项有统计函数,且另外还有不含统计函数输出项(除常量外)的情况下。象你这个案例的子查询中,输出项仅有一个,虽然它包含了统计函数,但没有其它不含统计函数的项,所以不需要分组。如果分组,逻辑意义就变成了每个罐号的最大编号,当然会有多个输出记录。同时,也与你本来想表达的意思完全不一样了。你的本意是仅输出一条记录,这条记录的字段就是所有罐号的最大编号,对吧?因此,你必须把蓝色部分删除掉。
你修正这两个问题后,相信不管在6.0还是9.0版本上都能顺利输出记录了。另外,建议你不要动不动就去SET成和低版本兼容,应该把自己的思维转到9.0的查询中来,毕竟高版本的查询语句结构和用法要比低版本严谨,也更接近Oracle等大型数据库的相应语句和我们平时的思维逻辑。
[
本帖最后由 taifu945 于 2013-2-14 12:46 编辑 ]