You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何子查询输出相同的两个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_IDINVOICE_MAX
37224
7221842
8090.36
831575
862433
9417.5
9546.21
96662
979.95
10241.8
106503.2
11020551.18
1156
1211962.13
1222312.2
123158

差异原因

两种查询的核心区别是对重复最大值的处理逻辑:

  • WHERE IN查询:主表会筛选出所有invoice_total等于子查询中任意一个最大值的记录,再求和。如果有多个记录(来自同一或不同供应商)的invoice_total刚好等于某个最大值,这些记录都会被计入总和,相当于重复计算了该最大值。
  • 内联视图查询:子查询已经按vendor_id分组,每个供应商只返回一个唯一的最大值,主查询直接对这16个唯一值求和,每个最大值仅计算一次,不会重复累加。

两者的差值52680.48 - 52434.53 = 245.95,说明WHERE IN查询多计算了某个/某些值,大概率是原表中存在多个与子查询最大值相同的发票记录,而这些记录在内联视图方案中只被统计一次。

内容的提问来源于stack exchange,提问作者prkbly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:32:12