Foxpro VS SQL逻辑

时间:2019-01-02 17:56:13

标签: tsql foxpro

我想不出更好的标题。如果您有任何建议,请随时编辑我的帖子标题。

我有一个如下所示的foxpro查询:

Sele
 a.plan_enddt as enddt, a.plrevno, a.keyfld, "PLAN    " as source ;
    from a_plan a inner join c_temp1a_pre b ;
    on a.keyfld=b.keyfld and a.plrevno=b.plrevno ;
    into cursor c_temp1a ;
    group by a.keyfld ;
    where a.plan_enddt>=date1 ;

我想做的是将foxpro转换为T-SQL。

该foxpro语句是否会失败,因为分组依据中仅列出了1列?

编辑:

我不是在寻找解决我的foxpro语句的方法

在TSQL中,即使您未使用聚合函数,如果您在select语句中有多个列,也不能仅按1列分组。

在Foxpro中也是如此吗?

2 个答案:

答案 0 :(得分:0)

您可以使用:

Select MIN(a.plan_enddt) as enddt, MIN(a.plrevno), a.keyfld, 'PLAN    ' as [source]
from a_plan a 
inner join c_temp1a_pre b
  on a.keyfld=b.keyfld 
 and a.plrevno=b.plrevno 
where a.plan_enddt>=date1
group by a.keyfld ;
  

“我不是在寻找解决我的foxpro语句的方法”

这与MySQL和PostgreSQL之间的情况相同:Group by clause in mySQL and postgreSQL, why the error in postgreSQL?

  

如果SQL99和更高版本在功能上依赖于GROUP BY列,则按可选功能T301允许此类非聚合

T-SQL 2.1.2.221 T301, Functional dependencies

答案 1 :(得分:0)

在Foxpro(Visual Foxpro 8和更早版本)中,这样的错误看起来像接受无效的group by子句。 select中列出的不是聚合值的所有字段也应属于“分组依据”字段。

赞:

select min(a.plan_enddt) as enddt, min(a.plrevno) as plrevno, a.keyfld, "PLAN " as source from a_plan a inner join c_temp1a_pre b on a.keyfld=b.keyfld and a.plrevno=b.plrevno into cursor c_temp1a group by a.keyfld where a.plan_enddt>=date1 ;

或者这个:

select a.plan_enddt as enddt, a.plrevno, a.keyfld, "PLAN " as source from a_plan a inner join c_temp1a_pre b on a.keyfld=b.keyfld and a.plrevno=b.plrevno into cursor c_temp1a group by a.keyfld, a.plan_enddt, a.plrevno where a.plan_enddt>=date1 ;

但是在这种情况下,您可以获得多个记录,并且按几个字段分组。