两个SQL查询结果不一致,请求解析二者差异
两个SQL查询结果差异的原因
先把你的两个查询贴出来:
第一个查询
SELECT DISTINCT ID FROM TABLE WHERE KEY = 'TRUE' AND ID NOT IN (SELECT DISTINCT ID FROM TABLE WHERE KEY = 'TRUE' AND VALUE = 0);
第二个查询
SELECT DISTINCT ID FROM TABLE WHERE KEY = 'TRUE' AND VALUE != 0;
这俩查询的核心差异在于逻辑判断范围和对NULL值的处理,具体拆解:
1. 逻辑目标完全不同
- 第一个查询是找「所有满足
KEY='TRUE',且该ID不存在任何一条KEY='TRUE'且VALUE=0的记录」的ID。哪怕这个ID有VALUE IS NULL或者VALUE≠0的记录,只要没有VALUE=0的记录,就会被选中。 - 第二个查询是直接从「
KEY='TRUE'且VALUE≠0的行」里提取去重后的ID。如果某个ID同时存在VALUE=0和VALUE≠0的行,第二个查询会返回这个ID(因为有符合条件的行),但第一个查询会把它排除(因为存在VALUE=0的记录)。
2. NULL值导致的结果差异
SQL中,VALUE != 0的判断会直接过滤掉VALUE IS NULL的行——因为NULL和任何值比较的结果都是未知(UNKNOWN),不会被纳入条件。但第一个查询的逻辑不同:
- 如果某个ID的所有
KEY='TRUE'的记录都是VALUE IS NULL,它不会出现在子查询的结果里,所以主查询会选中这个ID; - 但第二个查询里,这类ID的行因为
VALUE IS NULL不满足VALUE≠0,所以不会被选中。
举个实际数据的例子更清楚:
| ID | KEY | VALUE |
|---|---|---|
| 1 | TRUE | 1 |
| 1 | TRUE | 0 |
| 2 | TRUE | NULL |
| 3 | TRUE | 2 |
- 第一个查询返回:
2, 3(ID1因为存在VALUE=0的记录被排除;ID2没有VALUE=0的记录,所以被选中;ID3符合条件) - 第二个查询返回:
1, 3(ID1有VALUE=1的行,满足条件;ID2的VALUE是NULL,被过滤;ID3符合条件)
关于“重复ID”的疑问
你提到第二个查询返回重复ID,但两个查询都加了DISTINCT,理论上都不会返回重复的ID值。如果实际出现了重复,大概率是这两种情况:
- ID字段存在隐式类型转换(比如字符串型的"1"和数字1被视为不同值,但显示看起来一样);
- 你观察的结果有误,建议检查ID字段的数据类型和实际返回的原始内容。
内容的提问来源于stack exchange,提问作者kev97mad
相关产品推荐
相关产品推荐

