左连接/或 - [SQL ACCESS]

时间:2016-06-14 21:50:09

标签: sql ms-access join

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

[Build or something]

我的SQL请求:

- 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

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

3 个答案:

答案 0 :(得分:1)

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

AND (THIS OR THAT OR THEOTHER)

而不是

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

答案 1 :(得分: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 :(得分:1)

这是工作! :

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))