[英]SQL- Creating an Inner JOIN for Two Columns inside Same Table
我正在尝试从我的书中找出一个练习题。 问题是这样的:
查找所有尚未开具发票的供应商。 (提示: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的同时如何显示差异?
内部将表自身联接以解决此特定问题似乎很愚蠢(有很多充分的理由进行自我联接,但这不是其中之一),但我认为从“实践问题”的角度出发,这是合理的。
我想在这里最好是在invoices
之前预先汇总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
。 根据需要进行编辑。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.