2016-09-29 71 views
1

我的數據庫表的數據是這樣的:SQL + 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的最大值行,但只有那些滿足過濾criteria.I可能行使其工作使用查詢,看起來像:

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構建器編寫此邏輯。所以我需要一些具有JPA 2.0支持功能的解決方案。我的數據庫是Oracle 11g,JDK版本是1.7.051。

回答

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; 
+0

爲什麼必須通過'col1'分區當存在用於'COL1 =「value''的過濾條件?另外,OP似乎需要輸出中的所有六列,並且子查詢中的FROM不應該跟隨單詞TABLE - 這可能會引發語法錯誤。 – mathguy

+0

@mathguy。 。 。因爲如果OP將'='更改爲不等式會更安全。 –

+0

按預期工作!也容易理解。謝謝, – user613114