在Left Join的右侧,我无法在Date字段上设置Where子句。如果更改为内部联接,或者如果我在非日期字段上设置Where,则它可以正常工作。
这在标准表达式""数据类型不匹配时失败。错误:
SELECT tblFuture.ContractNo
FROM tblFuture LEFT JOIN qryActualDeliveriesDump_summarized
ON tblFuture.ContractNo = qryActualDeliveriesDump_summarized.ContractNo
WHERE qryActualDeliveriesDump_summarized.Dt=#2/1/2014#;
这非常有效:
SELECT tblFuture.ContractNo
FROM tblFuture INNER JOIN qryActualDeliveriesDump_summarized
ON tblFuture.ContractNo = qryActualDeliveriesDump_summarized.ContractNo
WHERE qryActualDeliveriesDump_summarized.Dt=#2/1/2014#;
同样如此:
SELECT tblFuture.ContractNo
FROM tblFuture LEFT JOIN qryActualDeliveriesDump_summarized
ON tblFuture.ContractNo = qryActualDeliveriesDump_summarized.ContractNo
WHERE qryActualDeliveriesDump_summarized.ContractNo=41012;
字段ContractNo是Long类型,字段Dt来自调用DateSerial的查询(某年,某些月,某天)。这闻起来像一个Access bug,但谷歌搜索没有任何东西给我。我使用的是Access 32 32位。
答案 0 :(得分:0)
使用外连接时,您必须在where子句中使用OR null或更合适,在Cartesian形式之前过滤,通过对连接本身进行过滤来生成连接。这仅适用于未返回所有结果的表上的过滤器(在本例中为qryActualDeliveriesDump_summarized)。笛卡尔结果来自qryActualDeliveriesDump_Summarized的空记录where子句过滤掉那些空记录,但是你想要它们。那该怎么办?
解决方案:将过滤器添加到连接中,以便在生成Cartesian之前进行,或者将or field is null
添加到where子句。
SELECT tblFuture.ContractNo
FROM tblFuture LEFT JOIN qryActualDeliveriesDump_summarized
ON tblFuture.ContractNo = qryActualDeliveriesDump_summarized.ContractNo
and qryActualDeliveriesDump_summarized.Dt=#2/1/2014#;
OR(虽然这不是那么干净)
SELECT tblFuture.ContractNo
FROM tblFuture LEFT JOIN qryActualDeliveriesDump_summarized
ON tblFuture.ContractNo = qryActualDeliveriesDump_summarized.ContractNo
WHERE (qryActualDeliveriesDump_summarized.Dt=#2/1/2014# OR qryActualDeliveriesDump_summarized.Dt is null);
后者有它自己的问题,例如如果字段可以为null,则由于基表中的连接vs空值,您无法分离出已为空的记录。它往往是一个非问题,但在某些条件下可能会出现问题,这就是为什么在联接中添加标准是一个更好的答案。
然而在访问... 它必须分为两步:第一步获取一组包含过滤结果的数据,然后进行连接。否则,将消除外连接的空值。
SELECT tblFuture.ContractNo
FROM tblFuture
LEFT JOIN (Select * from qryActualDeliveriesDump_summarized where qryActualDeliveriesDump_summarized.Dt=#2/1/2014#) B on
ON tblFuture.ContractNo = B.ContractNo