2013-05-06 24 views
2

我回答的一個問題上的SO用下面的查詢:是否可以在沒有子查詢的情況下分組兩次?

SELECT s.address 
FROM shop s 
JOIN visit v ON s.shopid = v.shopid 
JOIN customer c ON v.customerid = c.customerid 
WHERE c.cname = 'John' 
GROUP BY 
s.address 
, c.customerid 
HAVING COUNT(*) > 1 

這工作得很好,但會返回重複的地址,如果有2個或更多的約翰對一個給定的商店誰符合查詢的條件,所以我修改我的答案:

SELECT DISTINCT a.address 
FROM 
(
SELECT s.address 
FROM shop s 
JOIN visit v ON s.shopid = v.shopid 
JOIN customer c ON v.customerid = c.customerid 
WHERE c.cname = 'John' 
GROUP BY 
s.address 
, c.customerid 
HAVING COUNT(*) > 1 
) a 

現在我的問題是:是否有可能實現評估聚集表達式時,首先進行分組,然後在一個單一的查詢,然後再選擇?

+0

大概的使用可以首先從重複母雞放入加入表中的不同客戶。 – Avi 2013-05-06 14:01:41

+0

該表中的客戶是不同的,當加入商店時發生重複,因爲許多約翰可以在單一商店購買。 – kyooryu 2013-05-06 14:07:34

+0

如果你必須獨自承擔地址,然後放在餐桌店完全你可以嘗試(選擇不同customerid作爲customerid,從店鋪地址)s然後把必要的加入 – Avi 2013-05-06 14:12:03

回答

2

你可以做到這一點直接

SELECT distinct s.address 
FROM shop s 
JOIN visit v ON s.shopid = v.shopid 
JOIN customer c ON v.customerid = c.customerid 
WHERE c.cname = 'John' 
GROUP BY 
s.address 
, c.customerid 
HAVING COUNT(*) > 1 

我想這是你想要的。

SELECT是RBDMS所做的最後一件事(確實,順序是)。首先將過濾和分組,然後選擇然後排序。

所以你可以使用group by,然後不同。不需要顯示你正在分組的字段。但是,您不能顯示未分組的字段,也不能顯示聚合函數中使用的字段。

+0

哦,如此不同的作品才選擇?那是我第一個回答的想法,但我認爲獨特性會在早些時候評估。之後,nono, – kyooryu 2013-05-06 14:05:28

+0

。首先在條款被評估,在那之後該組和一個(如果有的話)。然後,收集到的數據,你可以使用聚合函數,字符串函數等等等。一個獨特的是另一個認爲你可以做:) – 2013-05-06 14:14:43

+1

感謝您爲我清除所有:) – kyooryu 2013-05-06 16:21:14

相關問題