SQL中的左联接帮助

时间:2018-11-19 13:54:33

标签: sql postgresql outer-join

我必须列出没有发票但已支付发票……也许两次的客户清单。

但是使用我的代码(如下所述),它包含了左联接中的所有内容。但是,我只需要用绿色突出显示的行。

我应该如何只制作两个突出显示的表格?

Select paymentsfrombank.invoicenumber,paymentsfrombank.customer,paymentsfrombank.value
FROM paymentsfrombank
LEFT OUTER JOIN debtors
ON debtors.value = paymentsfrombank.value

4 个答案:

答案 0 :(得分:0)

SQL中有两个问题。首先,您需要按发票编号而不是按值进行合并,因为按值进行合并是没有意义的。其次,您只需选择没有相应债务的付款,即当您左联接时,右表在联接列中为“空”。 SQL将是这样的:

SELECT paymentsfrombank.invoicenumber,paymentsfrombank.customer,paymentsfrombank.value
FROM paymentsfrombank
LEFT OUTER JOIN debtors
ON debtors.InvoiceNumber = paymentsfrombank.InvoiceNumber
WHERE debtors.InvoiceNumber is NULL

答案 1 :(得分:0)

您只想从paymentsfrombank中选择列。那你为什么还要加入?

select invoice_number, customer, value from paymentsfrombank
except
select invoice_number, customer, value from debtors;

(这需要与您的示例完全匹配,即发票/客户的金额相同)。

答案 2 :(得分:0)

您可以使用NOT EXISTS

SELECT p.*
FROM paymentsfrombank p
WHERE NOT EXISTS (SELECT 1 FROM debtors d WHERE d.invoice_number = p.invoice_number);

但是,如果您添加了LEFT OUTER JOIN过滤条件子句以仅过滤出没有发票信息的丢失客户,则WHERE也将起作用:

SELECT p.invoicenumber, p.customer, p.value
FROM paymentsfrombank P LEFT OUTER JOIN 
     debtors d
     ON d.InvoiceNumber = p.InvoiceNumber
WHERE d.InvoiceNumber IS NULL;

注意:我使用表别名(pd)使查询更易于读写。

答案 3 :(得分:0)

在mysql中,我们通常采用这种方式来翻转关系并提取不具有关系的行。 Select paymentsfrombank.invoicenumber,paymentsfrombank.customer,paymentsfrombank.value FROM paymentsfrombank LEFT OUTER JOIN debtors ON debtors.value = paymentsfrombank.value where debtors.value is null