修改:使用Group By / Having子句的查询到另一个仅使用Select / From / Where的查询

时间:2015-09-06 18:28:19

标签: sql database

使用Group By / Having子句的查询是否可以修改为仅使用Select / From / Where子句的另一个查询?

TABLE T(a, b, c)

SELECT a, sum(c) 
FROM T 
WHERE b>10 
GROUP BY a 
HAVING sum(c)>5

如果您能详细解释为什么可以(不)这样做,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

当然,如果您的特定数据库支持这些功能,您可以使用窗口函数:

SELECT a, s
FROM (
  SELECT DISTINCT a, sum(c) OVER (PARTITION BY a) s
  FROM t1
  WHERE b > 10
) t2
WHERE s > 5

另一种选择是使用相关子查询,它适用于所有数据库:

SELECT a, s
FROM (
  SELECT DISTINCT a, (SELECT sum(c) FROM t t3 WHERE t1.a = t3.a AND b > 10) s
  FROM t t1
  WHERE b > 10
) t2
WHERE s > 5

如果不使用GROUP BYHAVING,这些替代方案会产生相同的结果。但是其中任何一个都会慢得多,而且我真的没有看到这一点......