sql - 对候选组使用 HAVING 子句时将评估哪一行?
问题描述
我是 SQL 新手。今天我对一个表使用GROUP BY
andHAVING
子句,就像:
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 文档中是否指定了这种行为。
解决方案
您的代码甚至不会在大多数数据库中运行,因为它a
在HAVING
子句中包含非聚合表达式。
但 SQLite 允许这样做。
如果指定了 HAVING 子句,则会对每组行计算一次作为布尔表达式。如果 HAVING 子句的评估结果为假,则丢弃该组。如果 HAVING 子句是聚合表达式,则在组中的所有行中对其进行评估。如果 HAVING 子句是非聚合表达式,则根据从组中任意选择的行对其进行评估...
发生的情况是 SQLite 选择组的任意行(通常是第一行)来评估HAVING
子句。
这就是为什么在更改行的插入顺序时会得到不同结果的原因。
推荐阅读
- arrays - 如何在iOS swift中的字符串数组中查找子字符串的索引
- javascript - 更改段落文本并在菜单项单击时突出显示
- python - 如果只有一些名称有中间名,如何拆分熊猫数据框中的名称列?
- css - CSS Grid minmax - 不遵守最小宽度
- python - 用于在两组字符串之间匹配模式的机器学习模型?
- wpf - 如何将 MouseButtonEventArgs 显式转换为具有 .Tag 的对象
- pandas - 删除不等于条件的行
- node.js - 如何在私有 IP 寻址的企业网络中使用在 docker 中运行的 slack auth
- java - 模式如何在 Java 中使用 .split() 括号?
- javascript - VueJS:尝试在 /dist 中编译两个 CSS 文件