2017-08-27 24 views
0

我想更新列c1,c2,c3上每個分組日期列的列c5(至1),其中c3在相同c1,c2組中最大。正與HQL對Oracle數據庫的工作有條件地基於特殊組hql中列的最大值更新

c1 | c2 | c3 | c4 | c5 | c5 after update 
2000 | a | 01 | x | 0 | 0 
2000 | a | 01 | y | 0 | 0 
2000 | a | 01 | z | 0 | 0 
2000 | a | 02 | z | 0 | 1 
2000 | a | 02 | x | 0 | 1 
........................... 
2000 | b | 01 | x | 0 | 0 
2000 | b | 01 | y | 0 | 0 
2000 | b | 01 | z | 0 | 0 
2000 | b | 02 | z | 0 | 1 
.......................... 
.......................... 
2001 | a | 01 | x | 0 | 0 
2001 | a | 01 | y | 0 | 0 
2001 | a | 01 | z | 0 | 0 
2001 | a | 02 | z | 0 | 0 
2001 | a | 02 | x | 0 | 0 
2001 | a | 02 | y | 0 | 0 
2001 | a | 02 | w | 0 | 0 
2001 | a | 03 | y | 0 | 1 
2001 | a | 03 | w | 0 | 1 
........................... 
2001 | b | 01 | x | 0 | 0 
2001 | b | 01 | y | 0 | 0 
2001 | b | 02 | x | 0 | 1 
2001 | b | 02 | z | 0 | 1 

回答

1

我不熟悉hql,但Google的一個快速搜索顯示它與SQL「相似」,但它是面向對象的。在你的問題中,你必須更新標準的關係型Oracle表,所以目前還不清楚你爲什麼需要或想要使用hql。

如果您訪問的方式,可以使用簡單的SQL語句Oracle數據庫,你可以用MERGE語句執行更新,就像這樣:(假設td是你的表的名稱)

merge into td 
    using (select c1, c2, max(c3) as max_c3 
      from  td 
      group by c1, c2 
     ) x 
     on (td.c1 = x.c1 and td.c2 = x.c2 and td.c3 = max_c3) 
when matched then update 
    set c5 = 1 
; 
1

您可以通過列c1c2case如下用windows聚合函數max分區它來生成你想要的結果。

SELECT t2.c1, 
     t2.c2, 
     t2.c3, 
     t2.c4, 
     CASE 
      WHEN t2.c3 = max(t2.c3) over(partition BY t2.c1, t2.c2 
             ORDER BY t2.c1) THEN 1 
      ELSE 0 
     END AS c5 
FROM table1 t2 
ORDER BY t2.c1, 
     t2.c2, 
     t2.c3 

結果

C1  C2 C3 C4 C5 
----------------------- 
2000 a 1 x 0 
2000 a 1 y 0 
2000 a 1 z 0 
2000 a 2 z 1 
2000 a 2 x 1 
2000 b 1 x 0 
2000 b 1 y 0 
2000 b 1 z 0 
2000 b 2 z 1 
2001 a 1 x 0 
2001 a 1 y 0 
2001 a 1 z 0 
2001 a 2 x 0 
2001 a 2 y 0 
2001 a 2 z 0 
2001 a 2 w 0 
2001 a 3 w 1 
2001 a 3 y 1 
2001 b 1 x 0 
2001 b 1 y 0 
2001 b 2 z 1 
2001 b 2 x 1 

您可以查看演示here

希望這會有所幫助。

+0

非常感謝。我希望hql,但我認爲我不能用hql編寫它,並且必須使用sql,因爲您回答了我...但是您是否可以編輯您的答案以將c5更新爲特定數字(0或1)? (我不想選擇...我想更新) – faraa

+1

哦。我錯過了更新的一部分。正如它已經由上面的mathguy寫的,所以你可以檢查。它會爲你工作,但是你需要在ddl中將'c5'列設置爲'default 0'。 – zarruq

+0

因此我無法使用您的查詢(進行一些修改)來更新? – faraa