我正在尝试从我的书中找出一个练习题。 问题是这样的:
查找所有尚未付款的供应商。 (提示:invoice_total会与Payment_total有所不同。
共有3种方式重写上述查询: 使用等联接,使用INNER JOIN和使用NATURAL JOIN。
我已经完成了第一步,
SELECT DISTINCT VENDOR_ID
FROM INVOICES
WHERE Invoice_Total != payment_total;
但是,当我尝试进行内部联接时,会不断出错。 Invoice_Total和Payment_Total都是同一“ INVOICES”表中的列。
在提取供应商ID的同时如何显示差异?
This is a picture of the practice database that I am working with.
答案 0 :(得分:0)
内部将表内部连接到自身以解决此特定问题似乎很愚蠢(有很多充分的理由进行自我联接,但这不是其中之一),但是我认为是从“实践问题”的角度出发这是合理的。
在这里,我认为最好在联接之前预先invoices
进行聚合以减少处理时间(除非有索引来帮助联接)
SELECT t1.vendor_id
FROM (SELECT vendor_id, sum(invoice_total) sum_invoice_total FROM INVOICES GROUP BY vendor_id) t1
INNER JOIN (SELECT vendor_id, sum(payment_total) sum_payment_total FROM INVOICES GROUP BY vendor_id) t2
ON t1.vendor_id = t2.vendor_id
WHERE
t1.sum_invoice_total != t2.sum_payment_total
尽管如果供应商有可能为发票多付货款,则这有可能会崩溃。考虑:
+------------+-----------+---------------+---------------+
| invoice_id | vendor_id | invoice_total | payment_total |
+------------+-----------+---------------+---------------+
| 1 | a | 10 | 20 |
| 2 | a | 10 | 0 |
+------------+-----------+---------------+---------------+
不进行预聚合(同样,这没有任何意义,但是可以使用):
SELECT DISTINCT t1.vendor_id
FROM invoices t1
INNER JOIN invoices t2
ON t1.invoice_id = t2.invoice_id
WHERE
t1.invoice_total != t2.payment_total
这几乎与原始查询相同,但增加了多余的内部联接。我只是在猜测您的主键为invoice_id
。根据需要进行编辑。