好吧,這應該很簡單,但對於我的生活,我無法弄清楚。我完全知道如何使用SQL來完成這項工作,但對於HQL來說我很新。HQL - 子查詢中的集合函數MAX()
這是交易。我有一個存儲分配的表格 - 文檔分配給用戶。在不同時間,文檔被重新分配給另一個用戶,但所有分配都存儲在分配表中以用於審計目的。合理?像這樣...
id documentID userID dateAssigned
-- ---------- ------ ------------
6 32 87 3/4/2013
7 83 87 2/3/2013
8 32 56 5/6/2013
9 12 56 1/2/2013
我需要顯示當前分配給給定用戶的文檔列表。在上述示例中,因爲文檔32隨後被分配給另一用戶,所以用戶56具有分配的兩個文檔(文檔32和12)並且用戶87具有一個(文檔83)。我還在嗎?
我想要做的是返回任何指定用戶的任何記錄爲任何分配的文件(隨後不重新分配)。所以,如果我查詢用戶56,我得到記錄#8和#9,如果我查詢用戶87,我得到記錄#7。這就是我想要做的。
我可以輕鬆地獲得每個文檔的最新任務的列表,執行以下操作:
SELECT a.id AS id, a.documentID AS documentID, a.userID AS userID, MAX(sa.dateAssigned) AS dateAssigned FROM DocumentAssignments a GROUP BY documentID
,將返回...
id documentID userID dateAssigned
-- ---------- ------ ------------
7 83 87 2/3/2013
8 32 56 5/6/2013
9 12 56 1/2/2013
但是,當然,如果我只需要添加一個WHERE條款對此,我沒有得到我真正想要的。例如,如果我用:
SELECT a.id AS id, a.documentID AS documentID, a.userID AS userID, MAX(sa.dateAssigned) AS dateAssigned FROM DocumentAssignments a WHERE userID=87 GROUP BY documentID
...這將返回...
id documentID userID dateAssigned
-- ---------- ------ ------------
6 32 87 3/4/2013
7 83 87 2/3/2013
...這是不行的,因爲記錄#6不是文件的最新分配記錄32.
所以,我想要做的是一樣的東西......
SELECT b.id AS id, b.documentID AS documentID, b.userID AS userID, b.dateAssigned AS dateAssigned FROM DocumentAssignments b WHERE id IN (SELECT a.id AS id, MAX(sa.dateAssigned) AS dateAssigned FROM DocumentAssignments a GROUP BY documentID) AND b.userID=87
也就是說,除了近乎完美,當然IN子句將不起作用,因爲它包含兩列(id和MAX(dateAssigned))。
瞭解困境?我試圖找出一種方法來使用聚合MAX()函數來限定分組函數,但是它不會出現在結果記錄集中。這將解決問題。必須有一個優雅的解決方案,但我沒有找到它。
任何幫助,非常感謝。
乾杯,
-Foswick