我想不出更好的标题。如果您有任何建议,请随时编辑我帖子的标题。
我有一个看起来像这样的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中也是如此吗?
您可以使用:
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之间的情况相同:mySQL和postgreSQL中的分组依据子句,为什么postgreSQL中会出现错误?
SQL99 及更高版本允许每个可选功能 T301 进行此类非聚合,如果它们在功能上依赖于 GROUP BY 列
T-SQL 2.1.2.221 T301,功能依赖项
(Visual Foxpro 8 及更早版本)中,接受这种无效的分组依据子句看起来很错误。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 ;
但是在这种情况下,您可以获得多个记录,其中有按几个字段分组。