左连接/或 - [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 访问]的主要内容,如果未能解决你的问题,请参考以下文章