繁体   English   中英

SQL-为同一表内的两列创建内部联接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM