2009-12-17 43 views
1

我有一個問題讓這個JPA查詢MS SQL Server上運行2008排序方式一欄,這不是在GROUP BY或Enapsulated在聚合

背景如下:用戶爲客戶創造就業機會,其中有很多。我向用戶顯示他最近使用的客戶端列表,以使選擇更容易。

SELECT DISTINCT c FROM Client c 
    JOIN c.jobs j 
    WHERE j.user = ?1 
    ORDER BY j.created DESC 

該查詢工作得很好 - 使用MySQL。 MS SQL Server(2008)抱怨說我不能按j.created排序,因爲它不是選擇列表的一部分。這是錯誤消息:

ORDER BY項目必須出現在 選擇列表中,如果SELECT DISTINCT是指定 。

我似乎無法找到這個限制的優雅解決方法。有人有想法嗎?

+0

您的JOINing條款在哪裏?這會給你每行的c鏈接到每一行匹配你參數的j。 – MartW 2009-12-17 17:22:34

+0

@CodeByMoonlight:不,這是JPA查詢語言,不是SQL。 「JOIN c.jobs」是完整連接子句。 – Henning 2009-12-17 17:24:22

+1

啊,有趣。不能說我喜歡與SQL的虛幻相似。 – MartW 2009-12-17 17:27:28

回答

4

因爲你從衆多的選擇不同的c,Sql服務器將不知道哪個j.created來排序。您可以按c進行分組,然後使用聚合按最小或最大j.created進行排序。類似...

SELECT c.col1, c.col2 
FROM Client c 
JOIN c.jobs j 
WHERE j.user = ?1 
Group by c.col1, c.col2 
ORDER BY MIN(j.created) DESC 
+0

謝謝!這有很大幫助。 – Henning 2009-12-17 18:04:18

2

這不是SQL的限制。問題是這種排序在你的查詢方面沒有意義。 Distinct運算符將聚合C的多個值,每個C值可能具有不同的創建日期。所以在這種情況下,SQL如何排序?

C Create 
1 1/1/2009 
2 3/1/2008 
1 12/2/2009 
9 4/1/2009 
+0

我應該看到這個問題。我不知道MySQL做了什麼......可能首先應用ORDER BY,然後應用DISTINCT,這將解釋爲什麼它起作用。無論如何,非常感謝! – Henning 2009-12-17 18:06:36

0

達克沃斯的答案几乎解決了這個問題,所以這僅供參考。

這是我讀鴨和約翰的回答後,第一次嘗試:

SELECT c FROM Client c JOIN c.jobs j 
    WHERE j.user = ?1 
    GROUP BY c 
    ORDER BY MIN(j.created) DESC 

但選擇全面的entites直接不與羣戲BY子句,並導致SQLGrammarException

相反,我現在只得到使用此查詢的ID:

SELECT c.id FROM Client c JOIN c.jobs j 
    WHERE j.user = ?1 
    GROUP BY c.id 
    ORDER BY MIN(j.created) DESC 

然後,我只需要獲取使用ID的實體。

謝謝大家!

0

可能是這個問題有點老,但我找到了一個更簡單的解決方法。

SELECT DISTINCT c FROM Client c 
    JOIN fetch c.jobs j 
    WHERE j.user = ?1 
    ORDER BY j.created DESC 

添加fetch關鍵字的加入與JPA說,包括在加入select語句使mssql場將不再抱怨了。

相關問題