为何子查询输出相同的两个SQL返回不同结果?解析WHERE IN与内联视图
WHERE IN子查询与内联视图的结果差异解析
问题背景
两个查询的子查询返回的最大值列表看似一致,但最终求和结果不同,核心差异在于两种子查询的逻辑本质不同。
我的查询
SELECT SUM(invoice_total) AS sum_of_maxes FROM invoices WHERE invoice_total IN (SELECT MAX(invoice_total) FROM invoices WHERE invoice_total - credit_total - payment_total > 0 GROUP BY vendor_id)
整体查询输出:
| SUM_OF_MAXES |
|---|
| 52680.48 |
子查询输出:
| MAX(INVOICE_TOTAL) |
|---|
| 224 |
| 21842 |
| 90.36 |
| 1575 |
| 2433 |
| 17.5 |
| 46.21 |
| 662 |
| 9.95 |
| 41.8 |
| 503.2 |
| 20551.18 |
| 6 |
| 1962.13 |
| 2312.2 |
| 158 |
教材解决方案
SELECT SUM(invoice_max) AS sum_of_maximums FROM (SELECT vendor_id, MAX(invoice_total) AS invoice_max FROM invoices WHERE invoice_total - credit_total - payment_total > 0 GROUP BY vendor_id) AS vendor_max_invoices
整体查询输出:
| SUM_OF_MAXIMUMS |
|---|
| 52434.53 |
子查询输出:
| VENDOR_ID | INVOICE_MAX |
|---|---|
| 37 | 224 |
| 72 | 21842 |
| 80 | 90.36 |
| 83 | 1575 |
| 86 | 2433 |
| 94 | 17.5 |
| 95 | 46.21 |
| 96 | 662 |
| 97 | 9.95 |
| 102 | 41.8 |
| 106 | 503.2 |
| 110 | 20551.18 |
| 115 | 6 |
| 121 | 1962.13 |
| 122 | 2312.2 |
| 123 | 158 |
差异原因
两种查询的核心区别是对重复最大值的处理逻辑:
WHERE IN查询:主表会筛选出所有invoice_total等于子查询中任意一个最大值的记录,再求和。如果有多个记录(来自同一或不同供应商)的invoice_total刚好等于某个最大值,这些记录都会被计入总和,相当于重复计算了该最大值。- 内联视图查询:子查询已经按vendor_id分组,每个供应商只返回一个唯一的最大值,主查询直接对这16个唯一值求和,每个最大值仅计算一次,不会重复累加。
两者的差值52680.48 - 52434.53 = 245.95,说明WHERE IN查询多计算了某个/某些值,大概率是原表中存在多个与子查询最大值相同的发票记录,而这些记录在内联视图方案中只被统计一次。
内容的提问来源于stack exchange,提问作者prkbly
相关产品推荐
相关产品推荐

