为什么这两个查询在子查询具有相同的输出时返回不同的值?

问题描述 投票:0回答:1

我正在浏览 SQL 工作簿,我想知道为什么这两个查询返回不同的结果?

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
1 52680.48

子查询输出:

最大(INVOICE_TOTAL)
1 224
2 21842
3 90.36
4 1575
5 2433
6 17.5
7 46.21
8 662
9 9.95
10 41.8
11 503.2
12 20551.18
13 6
14 1962.13
15 2312.2
16 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)

整个查询输出:

最大总和
1 52434.53

子查询输出:

供应商_ID INVOICE_MAX
1 37 224
2 72 21842
3 80 90.36
4 83 1575
5 86 2433
6 94 17.5
7 95 46.21
8 96 662
9 97 9.95
10 102 41.8
11 106 503.2
12 110 20551.18
13 115 6
14 121 1962.13
15 122 2312.2
16 123 158

当我自己运行子查询时,它们返回相同的

MAX(invoice_total)
值,但完整运行脚本会创建两个不同的最终输出,这让我感到惊讶。当然方法是不同的,但我不知道为什么结果应该是这样。我是否做错了什么或者我应该期望子查询在
FROM
WHERE
下表现不同?

sql
1个回答
0
投票

执行错误查询时您观察到的问题是,您确定为一个供应商 ID 的最大发票的同一张发票会出现在其他供应商 ID 中,但它不是最大值。 正确的查询仅获取每个供应商 ID 的最高发票并对它们求和,但您的查询也会对所有其他发生的情况求和。

您可以通过以下查询找到多次出现的带有供应商 ID 的发票:

SELECT
  invoice_total, vendor_id
FROM invoices
WHERE invoice_total
IN
(SELECT 
  invoice_total
FROM invoices
GROUP BY 
  invoice_total
HAVING 
  COUNT(vendor_id) > 1)
ORDER BY invoice_total;

或者您可以更改错误的查询并选择所有列,然后按发票总额排序:

SELECT *
FROM invoices
WHERE invoice_total IN
    (SELECT MAX(invoice_total)
    FROM invoices
    WHERE invoice_total - credit_total - payment_total > 0
    GROUP BY vendor_id)
ORDER BY invoice_total;

然后您将只会看到查询包含的“重复”行,而正确的行不会。

我创建了一个样本小提琴,您可以在其中重现此行为。

© www.soinside.com 2019 - 2024. All rights reserved.