【问题标题】:SQL: How to disable result of aggregate on empty table?SQL:如何禁用空表上的聚合结果?
【发布时间】:2019-03-02 00:44:46
【问题描述】:

在空表上应用 SQL 聚合函数(COUNTMAX 等)时,我希望得到一个空结果集(无行)以简化 ORM 中的处理。

当前,特殊返回值(0 用于 COUNTNULL 用于所有其他聚合)are returned(假设为空表 user):

sqlite> SELECT COUNT(id) FROM user;
count(id)
0

我知道使用GROUP BY 加上HAVING 子句过滤空结果的技巧,但这相当麻烦,我不确定性能:

sqlite> SELECT COUNT(id) FROM user GROUP BY 1=1 HAVING COUNT(id) > 0;
sqlite>

因此问题:

  • 如果源表为空,是否可以禁用聚合函数返回一行?
  • 使用适用于所有条目的 GROUP BY 子句是否会影响性能?

【问题讨论】:

  • sqlite 不支持没有 GROUP BY 的 HAVING(至少)。我想知道更多关于源集很大时对性能的影响。

标签: sql sqlite


【解决方案1】:

没有group by 的SQL 聚合查询返回一行。这是根据定义。这就是 SQL 的工作方式。通常,这被认为是一件好事,实际上可以使应用程序更好地工作。

例如,检查单个列 count 比检查 count(如果有行)和检查没有行(在其他情况下)更容易。

在 SQLite 中,您可以通过添加 GROUP BY 来做您想做的事情。所以:

select . . . -- aggregation functions only
from . . .
group by null;

这是按常量分组,在功能上等同于没有group by,除非没有行。此版本返回一个空结果集。

【讨论】:

  • 不需要 HAVING。
  • 如果表中没有行,或者在 WHERE 后面留下,结果无论如何都是空的,即使没有 HAVING。
猜你喜欢
  • 2012-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2019-12-03
  • 1970-01-01
相关资源
最近更新 更多