我正在浏览 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
下表现不同?
执行错误查询时您观察到的问题是,您确定为一个供应商 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;
然后您将只会看到查询包含的“重复”行,而正确的行不会。
我创建了一个样本小提琴,您可以在其中重现此行为。