SQL-在同一表格内为两列创建内部JOIN

时间:2018-09-21 19:56:34

标签: sql oracle-sqldeveloper

我正在尝试从我的书中找出一个练习题。 问题是这样的:

查找所有尚未付款的供应商。 (提示: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.

1 个答案:

答案 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。根据需要进行编辑。