左连接/或 - [SQL 访问]

Posted

技术标签:

【中文标题】左连接/或 - [SQL 访问]【英文标题】:Left Join / OR - [SQL ACCESS] 【发布时间】:2016-06-14 21:50:08 【问题描述】:

我尝试管理一个交付团队。 这就是为什么,我想显示一张桌子。第一行将在一天内完成。 以下行将填充状态及其持续时间。 “日期”行必须包含该月的所有日期。即使没有人工作。

- First table (typeState) -
deliveryStatusDuration  //State Time (seconds)  INTEGER
deliveryStatus  //Type Status                   INTEGER
startStatus  //Start of the state               DATE
endStatus  //End of the state                   DATE
deliveryCarNum  //deliverer identifier          INTEGER


- Second table (dateTable) -
dateInt // Just an integer (from 1 to 31)       INTEGER

我的 SQL 请求:

SELECT SUM(deliveryStatusDuration) AS DURATION, deliveryStatus, datetable.dateInt
FROM datetable                      
LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus)
WHERE deliveryCarNum=:CarNum      
AND startStatus >= :DateStart
AND endStatus <= :DateEnd        
AND (typeState.startStatus Is Null)
OR (typeState.deliveryStatus Is Null)  
OR datetable.dateInt <= DAY(:DateEnd)    
GROUP BY datetable.dateInt, deliveryStatus 

问题是无论使用哪个月份,都会显示所有信息。 我认为“OR”会破坏我的“AND”,所以我没有状态开始的那些日子。 例如,如果送货员从 2016 年 5 月 4 日开始送货,到 2016 年 5 月 8 日结束;我的请求没有出现在 8 月 4 日。: 1 2 3 5 6 7 8 9 10...31

【问题讨论】:

修正括号,实现你真正想要的逻辑。 此外,如果您希望包含所有日期整数,请将 typestate 条件从 where 子句移动到 join on 语句。将它们放在 where 子句中将限制它们的整个结果集,而将它们作为连接条件将限制允许匹配的内容并包含在 typestate 表中 【参考方案1】:

我猜你想要的WHERE 子句是:

WHERE deliveryCarNum = :CarNum AND
      startStatus >= :DateStart AND
      endStatus <= :DateEnd AND   
      (typeState.startStatus Is Null OR
       typeState.deliveryStatus Is Null OR
       datetable.dateInt <= DAY(:DateEnd)   
      ) 

【讨论】:

【参考方案2】:

正如戈登的评论所暗示的那样。您想将 OR 分组在一起。

AND (THIS OR THAT OR THEOTHER)

而不是

AND (THIS)
OR (THAT)
OR (THEOTHER)

【讨论】:

【参考方案3】:

这是工作! :

SELECT SUM(deliveryStatusDuration) AS DURATION, deliveryStatus, datetable.dateInt
FROM datetable                      
LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus)
WHERE deliveryCarNum = :CarNum AND
  startStatus >= :DateStart AND
  endStatus <= :DateEnd AND   
  (
   typeState.startStatus Is Null OR
   typeState.deliveryStatus Is Null OR
   datetable.dateInt <= DAY(:DateEnd)   
  )   
GROUP BY datetable.dateInt, deliveryStatus 

此请求选择正确的行(无论日期如何)。 但是我每天都看不到..

LEFT JOIN typeState ON datetable.dateInt = DAY(typeState.startStatus)  OR ((DAY(typeState.startStatus) Is Null)) 

【讨论】:

以上是关于左连接/或 - [SQL 访问]的主要内容,如果未能解决你的问题,请参考以下文章

SQL:左连接,右连接是啥概念啊

SQL:左连接,右连接是啥概念啊

使用 SQL 在 Access 中的 5 个表上进行内连接和左连接

使用 COUNT() 左连接的 SQL

使用或条件执行左连接缓慢

SQL:具有相似表的多个左连接