嵌套 isNull 查询中的 where 子句给出意外结果
where clause in nested isNull query giving unexpected result
下面的查询 returns 大约 200000 个结果。
此查询中嵌套 where
子句的工作不是很清楚,即它在图片中的什么位置?
如果我注释掉 isNull 中的 where 子句,那么我会得到 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
如果您希望我添加更多信息,请告诉我。
我想你只是想要 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 中的范围规则。这很可能是一个相关子句,因此需要一个限定的列名。
下面的查询 returns 大约 200000 个结果。
此查询中嵌套 where
子句的工作不是很清楚,即它在图片中的什么位置?
如果我注释掉 isNull 中的 where 子句,那么我会得到 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
如果您希望我添加更多信息,请告诉我。
我想你只是想要 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 中的范围规则。这很可能是一个相关子句,因此需要一个限定的列名。