我正在使用Microsoft SQL Server2014。我需要查找所有已下达或未下达的订单。流程看起来像这样:我们收到了请求,然后我们可以立即下订单,也可以在一段时间后下订单-'ReminderDate'。问题是订单有时会丢失,我想找到一种找到订单的方法
我尝试过
SELECT
a.[AddedDate],
b.[DateAdded],
b.[ReminderDate]
FROM request a
left join order b on a.clientId=b.clientId
where a.AddedDate between '2018-11-09' and '2018-11-17' and
b.DateAdded>a.AddedDate or b.clientId is null and
a.deleted=0 and
b.deleted=0
但这只向我显示成功放置的那些,并且我知道其中一些被错过了。问题是要在给定客户的请求日期后 之后查找所有AND位置都没有过AND的订单(是否可以在一个查询中进行?)。 请告诉我我在做什么错以及如何解决。
答案 0 :(得分:1)
对于我来说,您想要给定日期之后的所有所有订单对我来说似乎很奇怪。如果有多个订单,那将变得一团糟。如果有一个,我宁愿只拥有一个“下一个”:
select r.AddedDate, o.DateAdded, o.ReminderDate
from request r outer apply
(select top (1) o.*
from order o
where o.clientId = r.clientId and o.DateAdded > r.AddedDate and
o.deleted = 0
order by o.DateAdded desc
) o
where r.AddedDate between '2018-11-09' and '2018-11-17' and
r.deleted = 0 ;
答案 1 :(得分:0)
即使没有订单(a
),您是否仍想查看请求(b
)是否正确?
我建议您将b
的所有条件移到ON
的{{1}}子句中。这样一来,您就不需要进行LEFT JOIN
检查:
b.clientId IS NULL
如果您希望在SELECT
a.[AddedDate],
b.[DateAdded],
b.[ReminderDate]
FROM request a
LEFT JOIN order b ON a.clientId = b.clientId AND b.DateAdded > a.AddedDate AND b.deleted=0
WHERE a.AddedDate between '2018-11-09' and '2018-11-17' and a.deleted=0
中包含条件,则需要添加方括号(如注释中所指出),并确保您始终明确检查是否未找到任何订单,也就是WHERE
。
b.clientId is null
由您决定选择哪一个。我建议使用第一种方法,因为它更短并且需要考虑的情况更少。