对候选组使用HAVING子句时,将评估哪一行



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

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文档中指定的。

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

从SELECT/简单选择处理/生成结果行集:

如果指定了HAVING子句,则对每个组求值一次的行作为布尔表达式。如果评估结果HAVING子句为false,则丢弃该组。如果HAVING子句是一个聚合表达式,它在小组如果HAVING子句是非聚合表达式,则为根据组。。。

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

最新更新