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将=
更改为不等式,则更安全。按预期工作!而且也很容易理解。谢谢