2011-08-08 30 views
0

說我有兩個表:GROUP BY主鍵時,如何避免聚合函數和子查詢?

  • 對象
    • ID
  • object_event
    • ID
    • OBJECT_ID
    • 日期

我想抓住一切有一個日期範圍內的事件發生的對象。我想爲每個對象獲取最多一行,但同一對象上的許多事件可能發生在日期範圍內。下面的查詢給我id正是我想要:

SELECT object.id 
FROM object 
JOIN ON object.id = object_event.object_id 
WHERE object_event.date < ... 
GROUP BY object.id 

這是正常的,但如果我想要什麼的對象表中的其他領域呢?我不能讓他們聚集函數(name是一個字符串),但由於idobject的主鍵,還有一個函數依賴說法存在類似沒有歧義:

SELECT object.* 
<rest of query same as above> 

MySQL允許這個,但MS SQL不。我知道我可以用子查詢解決這個問題,但我想避免這種情況。

+0

任何你不喜歡子查詢的原因? – Jacob

+0

我不明白爲什麼如果列處於對象範圍內,您不能將它們包括在查詢中,因爲您已經將該列分組到了該表中最獨特的列。 – Mikeb

+0

這聽起來像DISTINCT可能會幫助你。這應該在正常的連接中工作,並且子查詢沒有太多錯誤 - 如果它們解決了你的問題。 – Randy

回答

4

你不是真的想在這裏做一個連接,而是尋找包含集。

像這樣的東西會更好地工作,並會比實施一個獨特的排序或一個組更有效。

SELECT O.* 
FROM object O 
WHERE EXISTS (SELECT * FROM object_event E WHERE date BETWEEN @myDate1 AND @mydate2 AND E.object_id = O.id) 
+0

另外,我注意到你對子查詢的厭惡,但我認爲你的意思是在聯合派生表中進行聚合/獨立排序,而不是實現半聯接。這實際上比通過 –

+0

做一個獨特或小組效率更高效,好吧,我放棄了:)似乎它們是唯一的跨數據庫方式。 – GomoX