是否可以在没有子查询的情况下分组两次?

时间:2013-05-06 13:52:17

标签: sql oracle

我通过以下查询回答了其中一个问题:

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个或更多John,则会返回重复地址,所以我修改了我的答案:

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

现在我的问题是:是否可以在评估聚合表达式时首先实现分组,然后在单个查询中进行选择?

1 个答案:

答案 0 :(得分: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,然后使用distinct。

无需显示您要分组的字段。但是,您无法显示未分组或在聚合函数中使用的字段。