JBu*_*ace 0 sql ms-access-2007
我在Access中有这个SQL查询,工作正常:
SELECT TableA.FieldA As [Code],
Count(TableA.FieldC) AS [Count]
FROM ((MainTable)
LEFT JOIN TableA ON MainTable.FieldB = TableA.FieldB)
WHERE (((MainTable.DateOf)>=#1/1/2012#))
AND Clng(TableA.FieldA) >= 119593451
AND Clng(TableA.FieldA) <= 119593461
GROUP BY TableA.FieldA;
Run Code Online (Sandbox Code Playgroud)
但是当我尝试另一个左连接时,就像这样:
SELECT TableA.FieldA As [Code],
Count(TableA.FieldC) AS [Count]
FROM ((MainTable)
LEFT JOIN TableA ON MainTable.FieldB = TableA.FieldB)
LEFT JOIN TableB ON TableA.FieldD = TableB.FieldD
WHERE (((MainTable.DateOf)>=#1/1/2012#))
AND Clng(TableA.FieldA) >= 119593451
AND Clng(TableA.FieldA) <= 119593461
GROUP BY TableA.FieldA;
Run Code Online (Sandbox Code Playgroud)
我在FROM claused中使用括号基于此:http://nm1m.blogspot.com/2007/10/multiple-left-joins-in-ms-access.html
它给出了错误Invalid use of Null,这对我来说没有意义,因为我没有执行空检查等.这里有什么问题?我正在尝试拉出TableB中的一个字段来显示(但还没有把它放在选择部分).
Access喜欢它的括号.在连接周围添加更多括号.
该CLng函数需要非空值.你可以解决这个问题CLng(Nz(TableA.FieldA, "0")) >= 119593451.但是,如果该字段是数字的,那么为什么你会在文本中开始使用它?这是一个严重的问题,我强烈建议立即修改(如果可能的话)将数据类型更改为数字类型.
但是你有另一个问题.LEFT JOIN如果你在WHERE条款中提出一个条件,就像你在查询中一样,那对于一个表是没有意义的!要么改变,INNER JOIN要么把你的条件TableA纳入ON条款LEFT JOIN.如果Access不允许此语法,则更改为派生表:
SELECT
TableA.FieldA As [Code],
Count(TableA.FieldC) AS [Count]
FROM
(
(
(MainTable)
LEFT JOIN (
SELECT * FROM TableA
WHERE
Clng(Nz(TableA.FieldA, "0")) >= 119593451
AND Clng(Nz(TableA.FieldA, "0")) <= 119593461
) TableA ON MainTable.FieldB = TableA.FieldB
)
LEFT JOIN TableB ON TableA.FieldD = TableB.FieldD
)
WHERE (((MainTable.DateOf)>=#1/1/2012#))
GROUP BY TableA.FieldA;
Run Code Online (Sandbox Code Playgroud)
注意:添加WHERE TableA.FieldA IS NOT NULL可能有效但可能无效.在Access中,它可以100%安全,但SQL Server中的此类查询不安全,因为无法保证应用条件的顺序.显然,在SQL Server中你可以转换为一个整数,即使是NULL并且没有CLng函数,但这一点仍然有效:不要养成依赖某些想象的WHERE条件顺序保护你免受无效类型转换的习惯:相反,你必须处理可能出错的表达式中的无效类型转换 - 这是最佳做法.
| 归档时间: |
|
| 查看次数: |
999 次 |
| 最近记录: |