`
lbtsf816
  • 浏览: 13439 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

关于一个DB2 order by排序的问题

 
阅读更多

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, 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);

}

String countHql = "select count(*) "+queryHql;

queryHql += " ORDER BY t.id";

return query(queryHql, countHql, pageNo==0? 1:pageNo, pageSize==0?10:pageSize);

}

分享到:
评论
1 楼 lliiqiang 2014-06-23  
尽量一次性返回所有有用的东西,当然不能浪费每一次操作,也要根据具体情况返回。其实在sql语句中修改权限可以用于查询是否存在或者个数等能够用于身份验证的。因为只需要自己等于自己然后因为它能够返回改变个数就知道有多少个了,当然修改条件就是查询条件.

相关推荐

    Oracle数据库中ORDER BY排序和查询按IN条件的顺序输出

    首先,`ORDER BY`用于指定查询结果的排序方式,可以基于一个或多个列进行升序(ASC)或降序(DESC)排序。然而,Oracle数据库的`ORDER BY`默认并不保证排序的稳定性。这意味着在相同排序键值的情况下,多次执行相同...

    db2expln使用说明

    4. **排序和分组**:如果SQL语句包含ORDER BY或GROUP BY子句,DB2 Expln会展示排序和分组的详细信息。 5. **索引建议**:DB2 Expln可能会提供优化建议,如创建新的索引来改进查询性能。 五、优化技巧 1. **对比...

    DB2数据库SQL注入语句

    例如,`and 0&lt;(SELECT LENGTH(PASSWD) FROM TABLE ORDER BY ID DESC FETCH FIRST 1 ROWS ONLY)`可以获取ID降序排列的表格中第一个'PASSWD'字段的长度,而`ASCII(SUBSTR(PASSWD,1,1))`可以获取该密码的第一个字符的...

    DB2到GreenPlum/PostgreSQL的转换指南

    - **主键**:DB2中的主键定义与GreenPlum/PostgreSQL相似,但需要注意的是,在GreenPlum/PostgreSQL中,主键约束通常会自动创建一个唯一索引。 - **外键**:DB2支持外键约束,但在GreenPlum/PostgreSQL中,外键约束...

    db2 reference

    `ORDER BY`则用于对结果进行排序。 2. **数据插入**:`INSERT INTO`语句用于向表中添加新的数据行。 3. **数据更新**:`UPDATE`语句允许修改已存在于表中的数据。 4. **数据删除**:`DELETE FROM`语句用于从表中...

    DB2数据表数据导EXCEL

    1. **EXPORT TO命令**:此命令用于将查询结果集导出到一个文件中,支持多种文件格式,包括CSV、XML等。 2. **ORDER BY子句**:用于对查询结果进行排序,确保数据的顺序性。 3. **CSV文件**:Comma-Separated Values...

    DB2学习资料

    这个命令会根据DB2的默认配置创建一个新的数据库实例。但实际操作中,可能需要指定更多的参数,如存储位置、缓冲池大小等,以满足特定的性能需求。 接着,建表命令是DB2中的另一个关键概念。使用`CREATE TABLE`语句...

    DB2中查找消耗CPU的SQL

    - 打开一个命令行工具(如Windows的CMD或Linux的Shell),输入`db2cmd`命令来启动db2cmd窗口。 2. **开启SQL语句的监控开关**: - 使用以下命令开启SQL语言的监控功能:`db2 update dbmcfg using DFT_MON_STMT ON...

    DB2关系型数据库基础教程

    此外,还会介绍更复杂的查询操作,如联接(JOIN)、子查询、聚合函数(COUNT, SUM, AVG等)以及排序和分组(ORDER BY, GROUP BY)。 事务处理是数据库系统的核心概念之一,DB2支持ACID特性(原子性、一致性、隔离性...

    DB2性能监控SQL

    除了关注运行时间,执行次数也是衡量SQL性能的一个重要指标。频繁执行的SQL可能会因为高并发而导致资源瓶颈。下面的SQL语句可以帮助我们找到执行次数最多的SQL: ```sql SELECT num_executions, average_execution_...

    IBM DB2数据库——SQL入门

    - **排序**:使用ORDER BY子句对查询结果进行排序。 - **分组**:使用GROUP BY子句将查询结果按一个或多个列进行分组,并结合聚合函数使用。 ##### &gt;}}] (第8章:连接查询) - **连接查询**:介绍如何使用JOIN...

    DB2 9 for z/OS

    DB2 9 for z/OS是IBM推出的一个新版本数据库管理系统,该版本针对z/OS操作系统进行了大量优化,旨在提高性能、可用性和安全性。它在SQL和XML功能方面进行了增强,并引入了一系列优化技术来改善整体性能。 #### 二、...

    DB2 优化,db2性能优化,查询优化

    DB2性能优化是一个综合性的过程,涉及到查询优化、并发性管理、系统统计等多个方面。通过对上述关键技术的掌握和实践,可以有效提升DB2数据库的性能表现,满足高并发、大数据量的企业应用需求。

    DB2使用经验积累及心得

    - **CURSOR ORDER BY以后不能FOR UPDATE**:对于已排序的游标,不能使用FOR UPDATE子句。 - **程序中间不能自由改变隔离级别**:事务隔离级别在事务开始后不能更改。 - **UPDATE不能用一个表中的记录为条件修改另一...

    DB2基础学习教程,PDF文挡内容详细

    此外,还会涉及SQL的聚合函数(如COUNT、SUM、AVG等)、分组(GROUP BY)和排序(ORDER BY)等高级查询技巧。 在DB2中,事务处理是数据管理的核心。事务是数据库操作的基本单元,确保数据的一致性。例如,你将学习...

    常见DB2锁等待解决流程

    在数据库管理领域,特别是针对IBM DB2数据库的应用场景中,锁等待是一个常见的性能瓶颈问题。当两个或多个事务请求对同一资源进行操作时,如果没有妥善处理这些请求间的相互依赖关系,则可能导致锁等待现象的发生,...

    DB2_SQL入门

    - **ORDER BY**:用于对结果集进行排序。 - 示例:`SELECT column_name FROM table_name ORDER BY column_name ASC/DESC;` - **LIMIT**:用于限制返回的行数。 - 示例:`SELECT column_name FROM table_name LIMIT...

    在db2和oracle中的对树的递归查询语句

    同时,为了防止无限递归,通常会设置一个最大递归深度,比如Oracle的`CONNECT_BY_ISCYCLE`和DB2的`WITH RECURSIVE`中的循环检测。 在实际应用中,了解并熟练掌握这些递归查询技巧对于处理树形结构的数据至关重要。...

    DB2_SQL课件

    SELECT语句用于从数据库表中检索数据,它能够对查询结果进行过滤(WHERE子句)、整合(GROUP BY子句)、排序(ORDER BY子句)以及过滤聚合数据(HAVING子句)。 3. 联接(Join):在DB2 SQL中,联接是将两个或多个表...

Global site tag (gtag.js) - Google Analytics