-
Notifications
You must be signed in to change notification settings - Fork 2.2k
[Bug] sqlserver查询聚合函数出错 #648
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Oracle, SQL Server, DB2 的分页 OFFSET 必须加 ORDER BY,默认是用 id,如果没有需要重写 getIdKey 返回对应主键名,或者前端传参 "@order":"key" // key / key+ / key- https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L1612-L1623 |
这个应该不是offset的主键id的问题,就是查询例子里面的Moment表,本来就是有主键id的。 "Moment": { 意思是查询最大日期。 照理不会牵涉到order by id 的问题,怎么后台会出现:order by 子句 列id无效,因为该列没有包含在聚合函数或group by子句中 这句报错? |
大概知道什么原因了,是限制行数导致查询出错。 建议能否完善下,如果包含聚合函数的查询,但又没有group的时候虽然是查全表但实际上永远只会回一行,这种情况就不要在后面加上 ORDER BY "id" OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY 来限制了。 |
那就需要调整下这里的逻辑,判断 RequestMethod.isGetMethod(method, true) 时,才拼接 FETCH 语句 |
|
外层 if 加个 method 的判断就行,我暂时还没时间处理 如果你已经知道问题所在、怎么解决,请直接 提交 Pull Request 为社区做贡献,非常感谢。 |
不是这里改order by的问题,而是要去掉 OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY才行,因为 select max(date) as date from Moment 当没有group by的时候永远只会返回一行,这种情况不能再拼接limitstring了。 |
加了 GROUP BY 就很可能不只一行了,在没法自动判断的前提下只能统一加上。 https://github.com/Tencent/APIJSON/blob/master/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L2576-L2591 如果想不拼接 FETCH 语句,可以前端在 [] 内传参 count: 1,并且后端改下 getLimitString 代码, boolean isTSQL = isOracle() || isSQLServer() || isDb2();
if (isTSQL && count == 1) {
return "";
} "@column":"max(date):date,max(id):id" 写法不符合 APIJSON 语法,必须用 ; 分号分隔 SQL 函数。 ![]() ![]() |
通过判断[]里面的count是否等于某个特定数字虽然是可以解决,但最好还是能不加[]和count,能自动判断是否需要加LimitString |
确实这样更好,应该可以像 Oracle 一样通过 ROW_NUM 替代 FETCH 来解决,相关判断 isOracle 的地方改成 (isOracle || isSQLServer) |
不需要分页的地方,也可以改用拼接 TOP 语句来简单解决 |
不需要加 @top 关键词,只要前端在 [] 内传参 count 并且 page 不是正数,或者只是查单个对象(count = 1),都直接对应转成 getSQL 方法内的 SELECT TOP $count,至于 getLimitString 就直接返回空字符串。 |
试了不行,count和page的值都必须大于等于0,提示page值不合法,必须是0-100 |
怎么会?只有 page == 0 时采用 TOP |
Uh oh!
There was an error while loading. Please reload this page.
APIJSON Version/APIJSON 版本号
6.2
Database Type & Version/数据库类型及版本号
sqlserver2012
Environment/环境信息
APIAuto Screenshots/APIAuto 请求与结果完整截屏
https://github.com/fengdu126/appokgo/blob/master/c80f2d8b563540fc110e9232b1f3b5d.png
Current Behavior/问题描述
Expected Behavior/期望结果
Any additional comments?/其它补充说明?
No response
The text was updated successfully, but these errors were encountered: