如何选择具有最小值

时间:2016-08-25 09:32:12

标签: oracle mybatis ibatis spring-mybatis

我正在使用oracle数据库和spring ibatis。

我有一个查询,它将返回两个结果,我需要获取一个列上具有最小值的记录。

在Oracle中,我使用以下查询执行此操作:

SELECT * 
FROM ANUMBER$ROOT ROOT 
WHERE ROOT.ROOT_NUMBER=1546305 
AND ROOT.MOL_WEIGHT = (SELECT MIN(MOL_WEIGHT) 
                       FROM ANUMBER$ROOT 
                       WHERE ROOT_NUMBER=1546305);

我已将此查询转换为如下所示的spring ibatis

SELECT * 
FROM ANUMBER$ROOT ROOT 
WHEREe ROOT.ROOT_NUMBER= #value# 
AND ROOT.MOL_WEIGHT = (SELECT MIN(MOL_WEIGHT) 
                       FROM ANUMBER$ROOT 
                       WHERE ROOT_NUMBER= #value#);

但这会让我失误:

  

** log4j:WARN找不到logger(org.springframework.context.support.ClassPathXmlApplicationContext)的appender。   log4j:WARN请正确初始化log4j系统。例外   线程"主要" org.springframework.jdbc.UncategorizedSQLException:   SqlMapClient操作;未分类的SQL []的SQLException; SQL   州[null];错误代码[0];
  ---错误发生在abbott / gprd / compoundInfo / dao / ibatis / LibraCompoundInformationLookup.xml中。

     

---准备执行映射语句时发生错误   ---检查selectCompoundInfoByRootNumber   ---检查SQL语句   ---原因:java.util.NoSuchElementException;嵌套异常是com.ibatis.common.jdbc.exception.NestedSQLException:
  ---错误发生在abbott / gprd / compoundInfo / dao / ibatis / LibraCompoundInformationLookup.xml中。

     

---准备执行映射语句时发生错误   ---检查selectCompoundInfoByRootNumber   ---检查SQL语句   ---原因:java.util.NoSuchElementException引起:com.ibatis.common.jdbc.exception.NestedSQLException:
  ---错误发生在abbott / gprd / compoundInfo / dao / ibatis / LibraCompoundInformationLookup.xml中。

     

---准备执行映射语句时发生错误   ---检查selectCompoundInfoByRootNumber   ---检查SQL语句   ---原因:com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:188)中的java.util.NoSuchElementException     在   com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject(GeneralStatement.java:104)     在   com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:566)     在   com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlMapExecutorDelegate.java:541)     在   com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSessionImpl.java:106)     在   org.springframework.orm.ibatis.SqlMapClientTemplate $ 1.doInSqlMapClient(SqlMapClientTemplate.java:243)     在   org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:193)     在   org.springframework.orm.ibatis.SqlMapClientTemplate.queryForObject(SqlMapClientTemplate.java:241)     在   abbott.gprd.compoundInfo.dao.ibatis.CompoundInformationDao.getCompoundInformationForRootNumber(CompoundInformationDao.java:66)     在   abbott.gprd.compoundInfo.dao.ibatis.CompoundInformationDao.main(CompoundInformationDao.java:183)   引起:java.util.NoSuchElementException at   java.util.StringTokenizer.nextToken(StringTokenizer.java:332)at   com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql.processDynamicElements(SimpleDynamicSql.java:90)     在   com.ibatis.sqlmap.engine.mapping.sql.simple.SimpleDynamicSql.getSql(SimpleDynamicSql.java:45)     在   com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:168)     ... 9更多错误:JDWP无法获得JNI 1.2环境,   jvm-> GetEnv()返回代码= -2 JDWP退出错误   AGENT_ERROR_NO_JNI_ENV(183):[../../../ src / share / back / util.c:820] **

任何人都可以帮助我将此查询从oracle转换为spring ibatis吗?

1 个答案:

答案 0 :(得分:0)

评论太长了:

您可以使用RANK(或DENSE_RANK)分析函数找到具有给定列的最小值的行(并且这不需要额外的相关查询):

SELECT *
FROM   (
  SELECT root.*,
         RANK() OVER ( ORDER BY MOL_WEIGHT ) AS rnk
  FROM   ANUMBER$ROOT ROOT 
  WHERE  ROOT_NUMBER=1546305
)
WHERE rnk = 1;