我在Access DB上的VB应用程序中有这个查询:
SELECT DISTINCT Specialization, MAX(a.faultZone) AS faultZone, ISNULL(a.faultCount, 0) AS NoOfFaults FROM Technicians AS t
LEFT JOIN
(
SELECT DISTINCT Faults.[Type] AS faultType, MAX(Faults.[Zone]) AS faultZone, COUNT(Faults.[Type]) AS faultCount
FROM Faults "
WHERE Faults.[Zone] = 8 " ' this value will be from variable
GROUP BY Faults.[Type] "
) AS a
ON (t.Specialization = a.faultType)
WHERE t.specialization <> 'None' "
GROUP BY a.faultCount, t.Specialization
它给出了我无法解决的以下问题......
“查询表达式中与函数一起使用的参数数量错误 'ISNULL(a.faultCount,0'。“
我想要实现的只是将NoOFFaults
的值设置为零,这意味着特定区域没有错误。
谢谢
答案 0 :(得分:7)
只是为了增加我的两分钱,虽然我喜欢Nz()的简单语法,但如果你寻求无故障性能,应该避免使用IsNull()和NZ()来支持Is Null:
IIF(a.faultCount Is Null, 0, a.faultCount)
。
请参阅此处的优秀解释:http://allenbrowne.com/QueryPerfIssue.html
此外,如果您的表位于SQL Server或Oracle中,使用Nz()将强制更多的查询在本地执行,并对性能产生巨大影响。
答案 1 :(得分:5)
Microsoft Access'版本的IsNull
与大多数SQL版本不同;它只是returns TRUE if the value is NULL, and FALSE if it isn't。
你需要基本上使用IIF()
构建自己的代码:
IIF(ISNULL(a.faultCount), 0, a.faultCount)
答案 2 :(得分:5)
我认为你正在寻找nz功能
Nz(a.faultCount, 0)
如果值为null,将返回0