Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQL+;JPA:返回最大值为单列的行_Java_Sql_Oracle_Jpa - Fatal编程技术网

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

Java SQL+;JPA:返回最大值为单列的行,java,sql,oracle,jpa,Java,Sql,Oracle,Jpa,我的数据库表数据如下所示: col1 col2 col3 col4 col5 col6 value null null blaDiff 0 x1 value null null blaDiff

我的数据库表数据如下所示:

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
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
我希望获取最大值为col5的行,但只获取满足筛选条件的行。我可以使用如下查询使其工作:

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
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
然后我的结果看起来像:

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
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编写此逻辑。因此,我需要一些解决方案,它具有JPA2.0支持的功能。我的数据库是Oracle 11g,JDK版本是1.7.051。

我倾向于使用窗口功能:

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;

当存在
col1='value'
的筛选条件时,为什么需要按
col1
进行分区?此外,OP似乎希望在输出中包含所有六列,子查询中的FROM后面不应该跟单词TABLE-这可能会引发语法错误。@mathguy。因为如果OP将
=
更改为不等式,则更安全。按预期工作!而且也很容易理解。谢谢