2012-05-22 92 views
0

我試圖連接兩個表,並從兩個表中選擇列,這些列基於哪裏約束條件以及分組條件。我遇到了一些我不明白的問題和行爲。我正在使用sybase。下面在兩個連接的表上使用GROUP BY BY HAVING

CREATE TABLE #test(
name varchar(4), 
num int, 
cat varchar(3) 
) 

CREATE TABLE #other(
name varchar(4), 
label varchar(20) 
) 

Insert #test VALUES('a',2,'aa') 
Insert #test VALUES ('b',2,'aa') 
Insert #test VALUES ('c',3,'bb') 
Insert #test VALUES ('a',3,'aa') 
Insert #test VALUES ('d',4,'aa') 

Insert #other VALUES('a','this label is a') 
Insert #other VALUES ('b','this label is b') 
Insert #other VALUES ('c','this label is c') 
Insert #other VALUES ('d','this label is d') 


SELECT t.name,t.num,o.label 
FROM #other o inner JOIN #test t ON o.name=t.name 
WHERE t.name='a' 
GROUP BY t.name 
HAVING t.num=MAX(t.num) 

一個簡單的例子,我得到無感時,我有GROUP BY(標籤列顯然與不同t.name)。如果我剪下GROUP BY語句的查詢行爲與我所期望的,但後來我不得不用這個作爲一個子查詢,然後應用

SELECT * FROM (subquery here) s GROUP BY s.name having s.num=MAX(s.num) 

必須有這樣做的更好的方法。任何幫助和解釋這種行爲將非常感激。

**我應該澄清。在我的實際查詢中,我有類似於 SELECT .... FROM(連接表)WHERE名稱IN(長名單),GROUP BY .....

+0

由於'WHERE t.name ='a'',我不明白'GROUP BY t.name'的意思。請通過顯示輸出來澄清它。 – sarwar026

回答

0

如果我理解了您的查詢得好。

SELECT t.name,t.num,o.label 
FROM #other o inner JOIN #test t ON o.name=t.name 
WHERE t.name='a' AND t.num=MAX(t.num) 
+0

問題是我想要每個t.name的最大值(t.num)。我知道自從這裏做了很多,因爲我在做t.name ='a',但在我的實際查詢中我有t.name('大字母列表') – JPC

0

您的GROUP BY必須包含t.name,t.num和o.label。如果你這樣做

GROUP BY t.name, t.num, o.label 

然後查詢執行沒有錯誤。

但是,您並未計算組中的任何聚合值。
你想做什麼?

+0

這是一個簡單的例子我正在努力。在我的實際查詢中,我試圖爲每個t.name – JPC

+0

@jpc獲取最新的日期記錄(即max t.num):請參閱John Dewey的答案,是您需要的嗎? – Phil

0

如果我正確理解你的要求,運行此...

SELECT t.name, num=MAX(t.num), o.label 
FROM #other o 
INNER JOIN #test t ON o.name=t.name 
WHERE t.name='a' 
GROUP BY t.name, o.label; 

......給了我這樣的結果:

name num   label 
---- ----------- -------------------- 
a 3   this label is a 
+0

我不認爲我正確表達了我的問題。我道歉。基本上,我使用GROUP BY名稱HAVING num = MAX(num)的原因並不是真的,因爲我需要實際的MAX(num),而是因爲與該特定記錄相關的數據是我想要的。我的實際項目涉及各種因素的各種實體的時間序列數據,所以我想檢索每個特定實體的最新日期(在我的簡化示例中,名稱是實體,數字是日期)。但我還希望在之前的where子句和選擇列來引用來自2個連接表中的列。 – JPC