LEFT JOIN помочь в SQL - PullRequest
       10

LEFT JOIN помочь в SQL

0 голосов
/ 19 ноября 2018

Я должен составить список клиентов, которые не имеют счета, но оплатили счет ... возможно, дважды.

Но с моим кодом (указанным ниже) он содержит все из левого соединения. Однако мне нужны только линии, выделенные зеленым.

Как мне составить таблицу только с двумя бликами?

image image

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

Ответы [ 4 ]

0 голосов
/ 19 ноября 2018

в mysql у нас обычно есть такой способ перевернуть отношение и извлечь строки, которые не имеют отношения.Select paymentsfrombank.invoicenumber,paymentsfrombank.customer,paymentsfrombank.value FROM paymentsfrombank LEFT OUTER JOIN debtors ON debtors.value = paymentsfrombank.value where debtors.value is null

0 голосов
/ 19 ноября 2018

Вы хотите выбрать только столбцы из paymentsfrombank.Так почему же вы даже присоединяетесь?

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

(для этого требуются точные совпадения, как в вашем примере, то есть та же сумма для счета / клиента).

0 голосов
/ 19 ноября 2018

Вы можете использовать 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), что облегчает чтение и запись.

0 голосов
/ 19 ноября 2018

В вашем 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
...