首页 > 解决方案 > 对候选组使用 HAVING 子句时将评估哪一行?

问题描述

我是 SQL 新手。今天我对一个表使用GROUP BYandHAVING子句,就像:

CREATE TABLE tab(a, b);
INSERT INTO tab VALUES(0, 1);
INSERT INTO tab VALUES(-1, 1);

SELECT COUNT(b) FROM tab GROUP BY b HAVING a;

我没有任何输出。

但是当我改变这两个INSERT语句的顺序时,我得到了输出2

INSERT因此,仅通过更改两个语句的顺序,我就得到了两个不同的输出。

当 HAVING 子句的评估结果为 false 时,可能会丢弃候选组,但是 SQLite 使用哪一列来评估 HAVING 子句的值?

我想知道 SQL 标准或 SQLite 文档中是否指定了这种行为。

标签: sqlsqlite

解决方案


您的代码甚至不会在大多数数据库中运行,因为它aHAVING子句中包含非聚合表达式。
但 SQLite 允许这样做。

SELECT/Simple 选择结果行集的处理/生成

如果指定了 HAVING 子句,则会对每组行计算一次作为布尔表达式。如果 HAVING 子句的评估结果为假,则丢弃该组。如果 HAVING 子句是聚合表达式,则在组中的所有行中对其进行评估。如果 HAVING 子句是非聚合表达式,则根据从组中任意选择的行对其进行评估...

发生的情况是 SQLite 选择组的任意行(通常是第一行)来评估HAVING子句。
这就是为什么在更改行的插入顺序时会得到不同结果的原因。


推荐阅读