SQL + JPA:返回最大值为单列的行

时间:2016-09-29 12:03:33

标签: java sql oracle jpa

我的数据库表数据如下:

col1                col2            col3                col4        col5        col6
value               null            null                blaDiff     0           x1  
value               null            null                blaDiff     0           x2  
value               null            blabla              null        1           x1  
value               null            blabla              null        1           x3  
value               bla             null                null        2           x1  
value               bla             null                null        2           x2  
value               otherBla        null                null        2           x3

我希望获取具有col5最大值的行,但只获取满足过滤条件的行。我可以使用查询看起来像:

SELECT col1
    ,col5
    ,col6
FROM TABLE v
WHERE v.col1 = 'value'
    AND (
        v.col2 = 'bla'
        OR v.col3 = 'blabla'
        OR v.col4 = 'blaDiff'
        )
    AND v.col5 = (
        SELECT MAX(v.col5)
        FROM TABLE v1
        WHERE v1.col1 = 'value'
            AND (
                v.col2 = 'bla'
                OR v.col3 = 'blabla'
                OR v.col4 = 'blaDiff'
                )
        );

然后我的结果如下:

col1                col2            col3                col4        col5        col6
value               bla             null                null        2           x1  
value               bla             null                null        2           x2

我想知道的是,有没有更好,更简单的方法来做到这一点。请注意,我在我的主题中提到了JPA,因为之后我需要使用JPA Criteria builder编写这个逻辑。所以我需要一些具有JPA 2.0支持功能的解决方案。我的数据库是Oracle 11g,JDK版本是1.7.051。

1 个答案:

答案 0 :(得分:1)

我倾向于使用窗口函数:

SELECT col1, col5, col6
FROM (SELECT v.*,
             MAX(col5) OVER (PARTITION BY col1) as max_col5
      FROM TABLE v
      WHERE v.col1 = 'value' AND
            (v.col2 = 'bla' OR v.col3 = 'blabla' OR v.col4 = 'blaDiff')
     ) v
WHERE v.col5 = v.max_col5;