【问题标题】:Rewriting the HAVING clause and COUNT function重写 HAVING 子句和 COUNT 函数
【发布时间】:2014-12-02 01:04:22
【问题描述】:

我试图从概念上理解如何重写 HAVING 子句和 COUNT 函数。

我被问到“找出所有贡献了三个或更多评分的评论者的名字。(作为一个额外的挑战,尝试在没有 HAVING 或没有 COUNT 的情况下编写查询。)”与这个简单的数据库相关:http://sqlfiddle.com/#!5/35779/2/0

使用 HAVING 和 COUNT 的查询很简单。没有,我有困难。

非常感谢您的帮助。谢谢。

【问题讨论】:

  • 包含示例数据而不是链接会有所帮助,设置小提琴会更好:sqlfiddle.com 显示您迄今为止尝试过的内容也很好,您应该指出什么您正在使用的数据库,因为它们之间的解决方案可能会有所不同。
  • 谢谢!这行得通吗? sqlfiddle.com/#!5/35779/2/0

标签: sql sqlite count rewrite having


【解决方案1】:

一种选择是在子查询中使用SUM(1) 代替COUNT,并使用WHERE 代替HAVING

SELECT b.name
FROM (SELECT rID,SUM(1) Sum1
      FROM rating
      GROUP BY rID
      )a
JOIN reviewer b
  ON a.rID = b.rID
WHERE Sum1 >= 3

演示:SQL Fiddle

更新:SUM(1) 的一些解释: 向SELECT 语句添加一个常量将导致该值对返回的每一行重复,例如:

SELECT rID
      ,1 as Col1
FROM rating

返回:

| rID | Col1 |
|-----|------|
| 201 |    1 |
| 201 |    1 |
| 202 |    1 |
| 203 |    1 |
| 203 |    1 |
......

SUM(1) 将常量1 应用于每一行并聚合它。

【讨论】:

  • 您能解释一下 SUM(1) 的总和是多少吗?
  • 想一想每一行只有1 的列,将所有这些1 加在一起就相当于COUNT,而不使用COUNT。不是你在实践中会做的事情,但它符合避免COUNT的要求。
猜你喜欢
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
相关资源
最近更新 更多