子查询中两个日期之间的SQL查询
我必须通过子查询中的两列来过滤结果,所以我必须像下面这样连接它们,这很好子查询中两个日期之间的SQL查询,sql,sql-server,Sql,Sql Server,我必须通过子查询中的两列来过滤结果,所以我必须像下面这样连接它们,这很好 select * from EDM_STATUS_REPORT_DATA LEFT JOIN ( Select DocumentID, LogDate From [LM_StateEvents] Where 1=1 ) table2 ON EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID AND EDM_STATUS_REPORT_DATA
select * from EDM_STATUS_REPORT_DATA LEFT JOIN
(
Select DocumentID, LogDate
From [LM_StateEvents]
Where 1=1
) table2
ON
EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
AND EDM_STATUS_REPORT_DATA.StatusDate = table2.LogDate
WHERE table2.DocumentID IS NOT NULL
但是,主查询中的EDM\u STATUS\u REPORT\u DATA.StatusDate
与子查询中的值不同。它的最大差值为+5秒。因此,我必须在table2.LogDate
和table2.LogDate+5秒之间进行搜索
我怎样才能做到这一点
下面是示例数据和预期输出
我想您需要交叉应用
:
select srd.*, le.*
from EDM_STATUS_REPORT_DATA src cross apply
(Select DocumentID, LogDate
From LM_StateEvents le
where le.LLObjID = srd.DocumentID and
le.LogDate = src.StatusDate
) le
where le.DocumentID is not null;
注意:您的outerwhere
子句表明您需要匹配。我想知道您为什么在这种情况下使用外部联接。我想您需要交叉应用:
select srd.*, le.*
from EDM_STATUS_REPORT_DATA src cross apply
(Select DocumentID, LogDate
From LM_StateEvents le
where le.LLObjID = srd.DocumentID and
le.LogDate = src.StatusDate
) le
where le.DocumentID is not null;
注意:您的outerwhere
子句表明您需要匹配。我想知道您为什么在这种情况下使用外部联接。您可以在此处看到此答案以向日期添加秒数(使用DateADD函数):您可以在此处看到此答案以向日期添加秒数(使用DateADD函数):您可以使用DATEDIFF
确保差异不超过5秒:
select * from EDM_STATUS_REPORT_DATA LEFT JOIN
(
Select DocumentID, LogDate
From [LM_StateEvents]
Where 1=1
) table2
ON
EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
AND DATEDIFF(second,EDM_STATUS_REPORT_DATA.StatusDate,table2.LogDate) between -5 and 5
WHERE table2.DocumentID IS NOT NULL
您可以使用DATEDIFF
确保差异不超过5秒:
select * from EDM_STATUS_REPORT_DATA LEFT JOIN
(
Select DocumentID, LogDate
From [LM_StateEvents]
Where 1=1
) table2
ON
EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
AND DATEDIFF(second,EDM_STATUS_REPORT_DATA.StatusDate,table2.LogDate) between -5 and 5
WHERE table2.DocumentID IS NOT NULL
通过连接到表,而不是创建子查询并连接到该表,可以大大简化这一过程。此外,您应该使用内部联接而不是左联接,因为where谓词正在将其更改为内部联接。我不允许在连接谓词中使用这样的函数,因为它们是不可争论的。您可能应该修改设计,这样就不必这样做。但是考虑到当前的表,您可以这样做
select *
from EDM_STATUS_REPORT_DATA rd
JOIN LM_StateEvents se on rd.LLObjID = se.DocumentID
AND abs(datediff(second, rd.StatusDate = se.LogDate)) <= 5
选择*
来自EDM\u状态报告\u数据rd
在rd.LLObjID=se.DocumentID上加入LM_StateEvents se
和abs(datediff(second,rd.StatusDate=se.LogDate))通过连接到表,而不是创建子查询并连接到该表,可以大大简化此过程。此外,您应该使用内部联接而不是左联接,因为where谓词正在将其更改为内部联接。我不允许在连接谓词中使用这样的函数,因为它们是不可争论的。您可能应该修改设计,这样就不必这样做。但是考虑到当前的表,您可以这样做
select *
from EDM_STATUS_REPORT_DATA rd
JOIN LM_StateEvents se on rd.LLObjID = se.DocumentID
AND abs(datediff(second, rd.StatusDate = se.LogDate)) <= 5
选择*
来自EDM\u状态报告\u数据rd
在rd.LLObjID=se.DocumentID上加入LM_StateEvents se
和abs(datediff(second,rd.StatusDate=se.LogDate))请提供示例数据和预期结果。为什么要加入子查询而不是表?为什么还要麻烦1=1??@GordonLinoff用示例数据和所需结果更新。@SeanLange 1=1只是一个占位符,用于放置实际的where条件。请提供示例数据和所需结果。为什么要加入子查询而不是表?为什么还要麻烦1=1??@GordonLinoff更新了样本数据和期望的结果。@SeanLange 1=1只是一个占位符,用来放置实际的where条件。此横向连接相当于内部连接
。所以,不需要过滤器。此横向连接相当于内部连接
。因此,不需要过滤器。