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 个或多个 John's 满足查询条件,则会返回重复的地址,因此我修改了答案:

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

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

4

1 回答 1

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,然后区分。

无需显示您正在分组的字段。但是您不能显示未分组或未在聚合函数中使用的字段。

于 2013-05-06T14:00:07.420 回答