Oracle:将基础连接查询与COUNT/GROUP BY/HAVING查询结合
实现方案
方案1:先聚合再关联(性能更优)
先对Table2完成聚合筛选,再通过ID_NO关联Table1获取需要的字段。如果同一个账号组合对应多个ID_NO,可根据需求加DISTINCT去重:
SELECT DISTINCT t1.col1 AS Name, t2_agg.account AS Account, t2_agg.totals AS Totals FROM ( -- 先做Table2的聚合逻辑,同时保留ID_NO用于关联 SELECT t2.ID_NO, t2.col1||t2.col2 AS account, COUNT(DISTINCT t2.col3) AS totals FROM Table2 t2 GROUP BY t2.ID_NO, t2.col1, t2.col2 HAVING COUNT(DISTINCT t2.col3) >=15 ) t2_agg INNER JOIN Table1 t1 ON t2_agg.ID_NO = t1.ID_NO
方案2:先连接再聚合(逻辑更直观)
直接基于原连接查询的逻辑,在关联后做聚合筛选:
SELECT t1.col1 AS Name, t2.col1||t2.col2 AS Account, COUNT(DISTINCT t2.col3) AS Totals FROM Table1 t1 INNER JOIN Table2 t2 ON t1.ID_NO = t2.ID_NO GROUP BY t1.col1, t2.col1, t2.col2 HAVING COUNT(DISTINCT t2.col3) >=15
注意事项
- 原查询2存在语法错误,
HAVING子句必须放在GROUP BY之后,上述代码已修正该问题。 - 如果业务上一个
col1||col2组合对应多个ID_NO,方案1中的DISTINCT可以按需保留或移除。
内容的提问来源于stack exchange,提问作者tree
相关产品推荐
相关产品推荐

