Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 日期字段上的左Join+Where子句_Sql_Database_Ms Access - Fatal编程技术网

Sql 日期字段上的左Join+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

在左联接的右侧,我无法在日期字段上设置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是长类型,字段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链接,仍然接受答案。