我必须列出没有发票但已支付发票……也许两次的客户清单。
但是使用我的代码(如下所述),它包含了左联接中的所有内容。但是,我只需要用绿色突出显示的行。
我应该如何只制作两个突出显示的表格?
Select paymentsfrombank.invoicenumber,paymentsfrombank.customer,paymentsfrombank.value
FROM paymentsfrombank
LEFT OUTER JOIN debtors
ON debtors.value = paymentsfrombank.value
答案 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;
注意:我使用表别名(p
和d
)使查询更易于读写。
答案 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