Date Date上的Left Join + Where子句

时间:2014-07-02 18:42:21

标签: sql database ms-access

在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位。

1 个答案:

答案 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