我通过以下查询回答了其中一个问题:
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
现在我的问题是:是否可以在评估聚合表达式时首先实现分组,然后在单个查询中进行选择?
答案 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。
无需显示您要分组的字段。但是,您无法显示未分组或在聚合函数中使用的字段。