Приведенный ниже запрос возвращает около 200000 результатов.

Работа вложенного предложения where в этом запросе не очень ясна, т.е. где оно находится на картинке?

Если я закомментирую предложение where внутри isNull, я получу 0 результатов, что нормально и ожидается, поскольку Max (invoiceID) не равен нулю после соединения.

select * from CustomerServices where isNull((
                                SELECT MAX(invoiceid) 
                                FROM Invoices 
                                    LEFT JOIN InvoicesHistory
                                        ON InvoicesHistory.ServiceHistoryID = Invoices.ServiceHistoryID 
                                WHERE serviceID = Invoices.serviceID
                            ),0)=0

Пожалуйста, дайте мне знать, если вы хотите, чтобы я добавил дополнительную информацию.

2
Rahul Verma 20 Июл 2017 в 14:13

1 ответ

Лучший ответ

Думаю, вы просто хотите not exists:

select cs.*
from CustomerServices cs
where not exists (select 1
                  from Invoices i left join
                       InvoicesHistory ih
                       on ih.ServiceHistoryID = i.ServiceHistoryID 
                  where cs.serviceID = i.serviceID
                 );

В вашем случае вложенное предложение WHERE ничего не делает. Это эквивалентно:

Invoices.serviceID = Invoices.serviceID

По правилам области видимости в SQL. По всей вероятности, это предложение корреляции и, следовательно, требуется уточненное имя столбца.

1
Gordon Linoff 21 Июл 2017 в 05:51
Нет необходимости в "max (i.invoiceid)" - это ГДЕ СУЩЕСТВУЕТ. Судя по именам таблиц, LEFT JOIN to InvoicesHistory также выглядит ненадежным.
 – 
Jason A. Long
20 Июл 2017 в 18:23
@ JasonA.Long. . . Наоборот. max(i.invoiceid) совершенно неверно. Он заставляет подзапрос возвращать ровно одну строку (это исправлено). left join находится в исходном вопросе OP, поэтому я понятия не имею, нужен он или нет. Замечу, что название столбца join довольно неожиданное.
 – 
Gordon Linoff
21 Июл 2017 в 05:52
@GordonLinoff: Разобравшись со всем вариантом использования, я обнаружил, что они на самом деле пытались реализовать «не существует», о котором вы упомянули здесь.
 – 
Rahul Verma
7 Авг 2017 в 15:57