SQL如何查找存在的日期

时间:2018-12-23 22:25:25

标签: sql sql-server

我正在使用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的订单(是否可以在一个查询中进行?)。 请告诉我我在做什么错以及如何解决。

2 个答案:

答案 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

由您决定选择哪一个。我建议使用第一种方法,因为它更短并且需要考虑的情况更少。