2013-09-27 54 views
0

好吧,這應該很簡單,但對於我的生活,我無法弄清楚。我完全知道如何使用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

回答

0

1)你可以返回的所有記錄,就像在第一HQL,並在Java中,然後過濾。

2)另一種方式,是過濾ID,並在同一子查詢的用戶:

SELECT b.id AS id, b.documentID AS documentID, 
b.userID AS userID, b.dateAssigned AS dateAssigned 
FROM DocumentAssignments b 
WHERE (b.id, b.userID) IN (SELECT a.id AS id, a.userID AS userID, 
          MAX(sa.dateAssigned) AS dateAssigned 
          FROM DocumentAssignments a 
          GROUP BY documentID) 
AND b.userID=87 

查看這方面的例子: http://docs.jboss.org/hibernate/core/3.5/reference/en-US/html/queryhql.html#queryhql-tuple

3)如果方式2不工作,嘗試篩選器您的查詢添加用戶與最新文檔相同的情況,如下所示:

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 
AND b.userID IN (SELECT a.userID AS userID, MAX(sa.dateAssigned) AS dateAssigned 
      FROM DocumentAssignments a 
      GROUP BY documentID)