Sql 日期字段上的左Join+Where子句
在左联接的右侧,我无法在日期字段上设置Where子句。如果更改为内部联接,或者在非日期字段上设置Where,则它将非常有效 此操作失败,条件表达式错误中的数据类型不匹配:Sql 日期字段上的左Join+Where子句,sql,database,ms-access,Sql,Database,Ms Access,在左联接的右侧,我无法在日期字段上设置Where子句。如果更改为内部联接,或者在非日期字段上设置Where,则它将非常有效 此操作失败,条件表达式错误中的数据类型不匹配: SELECT tblFuture.ContractNo FROM tblFuture LEFT JOIN qryActualDeliveriesDump_summarized ON tblFuture.ContractNo = qryActualDeliveriesDump_summarized.ContractNo WHER
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是长类型,字段Dt来自调用DateSerialsomeyear、somemonth和someday的查询。这闻起来像是一个访问错误,但谷歌搜索对我来说什么也找不到。我使用的是Access 2010 32位。当使用外部联接时,您必须在where子句中使用或null,或者更恰当地说,在笛卡尔形式之前进行过滤,通过对联接本身进行过滤来生成联接。这仅适用于表上的筛选器,这些表没有返回本例中总结的所有结果qryActualDeliveriesDump_。笛卡尔函数从qryActualDeliveriesDump_中生成空记录,where子句过滤掉这些空记录,但您需要它们。那怎么办呢 解决方案:将过滤器添加到联接中,使其在生成笛卡尔函数之前发生,或者将or字段添加到where子句中为null
SELECT tblFuture.ContractNo
FROM tblFuture LEFT JOIN qryActualDeliveriesDump_summarized
ON tblFuture.ContractNo = qryActualDeliveriesDump_summarized.ContractNo
and qryActualDeliveriesDump_summarized.Dt=#2/1/2014#;
或者虽然这不是很干净
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,则无法分离出由于基表中的join vs null值而为null的记录。这通常不是问题,但在某些情况下可能会有问题,这就是为什么向联接添加条件是更好的答案
然而在访问中。。。
它必须分为两个步骤:首先获取一组包含过滤结果的数据,然后进行连接。否则,外部联接的空值也将被消除
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
将条件移动到联接。qryActualDeliveriesDump_.Dt是日期字段吗?Sun W Kim:是。它是由一个返回日期数据类型DateSerial的函数生成的。第一个函数返回不支持的联接表达式,第二个函数给出相同的数据不匹配错误。xQbert:太棒了!从tblFuture LEFT JOIN中选择tblFuture.ContractNo从qryActualDeliveriesDump中选择*,其中YEARDt=2014作为tblFuture.ContractNo=innie.ContractNo上的innie;我相信在一个真实的数据库中,你们的其他建议会非常有效,但Access不喜欢它们。由于KB链接,仍然接受答案。