设为首页 收藏本站
查看: 1431|回复: 0

[经验分享] 关于一个DB2 order by排序的问题

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-11-17 00:01:59 | 显示全部楼层 |阅读模式
  SQL异常信息:
  [11-11-15 14:43:29:203 CST] 00000023 SystemOut     O - 在 SELECT 子句、HAVING 子句 或 ORDER BY 子句中指定的以 "ID" 开始的表达式未在 GROUP BY 子句中指定,
  或者它在 SELECT 子句、HAVING 子句或 ORDER BY 子句中,具有列函数,但未指定 GROUP BY 子句。. SQLCODE=-119, SQLSTATE=42803, DRIVER=3.62.56
  Java代码:
  public ItemPage getAlarmInfoPage(String systemId, String ipAddr, int pageNo, int pageSize) {
  String queryHql = "from AlarmInfo t where 1=1 ";
  if(systemId != null && !"".equals(systemId.trim())){
  queryHql += "and t.systemId "+LikeEscape.likeEscapeParam(systemId);
  }
  if(ipAddr != null && !"".equals(ipAddr.trim())){
  queryHql += "and t.ipAddr "+LikeEscape.likeEscapeParam(ipAddr);
  }
  queryHql += " ORDER BY t.id";
  String countHql = "select count(*) "+queryHql;
  return query(queryHql, countHql, pageNo==0?1:pageNo, pageSize==0?10:pageSize);
  }
  分析:
  以上期望是分页查询AlarmInfo的记录,并且查询结果根据ID来进行排序,在Hibernate中生成的DB2方言为:   
  [11-11-15 17:23:12:234 CST] 0000002a SystemOut     O Hibernate: 
  select
          * 
      from
          ( select
              rownumber() over(
          order by
              alarminfo0_.ID) as rownumber_,
              alarminfo0_.ID as ID0_,
              alarminfo0_.ENTI_ID as ENTI2_0_,
              alarminfo0_.ENTI_CODE as ENTI3_0_,
              alarminfo0_.ENTI_NAME as ENTI4_0_,
              alarminfo0_.KPI_ID as KPI5_0_,
              alarminfo0_.KPI_CODE as KPI6_0_,
              alarminfo0_.KPI_NAME as KPI7_0_,
              alarminfo0_.PROV_CODE as PROV8_0_,
              alarminfo0_.CITY_CODE as CITY9_0_,
              alarminfo0_.SYSTEM_ID as SYSTEM10_0_,
              alarminfo0_.CLASS_ID as CLASS11_0_,
              alarminfo0_.SCLASS_ID as SCLASS12_0_,
              alarminfo0_.BMODULE_ID as BMODULE13_0_,
              alarminfo0_.HOUSE_ID as HOUSE14_0_,
              alarminfo0_.IP_ADDR as IP15_0_,
              alarminfo0_.VALUE as VALUE0_,
              alarminfo0_.ALERT_TIMES as ALERT17_0_,
              alarminfo0_.ALAR_LEVEL as ALAR18_0_,
              alarminfo0_.RETRIVE_DATE as RETRIVE19_0_,
              alarminfo0_.FIRST_DATE as FIRST20_0_,
              alarminfo0_.LAST_DATE as LAST21_0_,
              alarminfo0_.STATUS as STATUS0_,
              alarminfo0_.LAST_UPD as LAST23_0_,
              alarminfo0_.ALAR_DESC as ALAR24_0_ 
          from
              ALARM_INFO alarminfo0_ 
          where
              1=1 
          order by
              alarminfo0_.ID ) as temp_ 
      where
          rownumber_ <= ?
  [11-11-15 17:23:12:250 CST] 0000002a SystemOut     O Hibernate: 
  select
          count(*) as col_0_0_ 
      from
          ALARM_INFO alarminfo0_ 
      where
          1=1 
    order by alarminfo0_.ID
  我们先了解下DB2的SELECT语句的执行顺序:form子句组装来自不同数据源的数据->where子句基于指定的条件对记录进行筛选->group by子句将数据划分为多个分组->使用聚集函数进行计算->使用having子句对分组进行筛选->计算所有的表达式->使用order by对结果集进行排序。
  在看SQL异常信息:在 SELECT 子句、HAVING 子句 或 ORDER BY 子句中指定的以 "ID" 开始的表达式未在 GROUP BY 子句中指定,或者它在 SELECT 子句、HAVING 子句或 ORDER BY 子句中,具有列函数,但未指定 GROUP BY 子句。也就是说在对结果集执行order by排序操作时找不到ID这个元素。
  代码只需要稍微修改下即可,修改后的代码:
  public ItemPage getAlarmInfoPage(String systemId, StringipAddr, int pageNo, int pageSize) {
  String queryHql = "from AlarmInfo t where 1=1 ";
  if(systemId != null &&!"".equals(systemId.trim())){
  queryHql += "and t.systemId"+LikeEscape.likeEscapeParam(systemId);
  }
  if(ipAddr != null && !"".equals(ipAddr.trim())){
  queryHql += "and t.ipAddr"+LikeEscape.likeEscapeParam(ipAddr);
  }
  String countHql = "select count(*) "+queryHql;
  queryHql += " ORDER BY t.id";
  return query(queryHql, countHql, pageNo==0?1:pageNo, pageSize==0?10:pageSize);
  }
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-301185-1-1.html 上篇帖子: 需要掌握的几条基本策略DB2数据库优化 下篇帖子: DB2中文字段在C程序中的乱码问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表