将SQL表与自身进行比较以查找缺少的时间表日期

时间:2017-04-05 21:34:39

标签: sql sql-server-2008 stored-procedures

下面的SQL查询有效,但由于使用了子查询,因此需要永久响应。我希望有人能为我找到优化此查询的方法。

data[i]

每个数据子集都是根据加载数据的时间(即加载日期)创建的。它查找当前加载(@ddlendDate)中从先前加载(@ddlstartDate)中丢失的任何日期。

我尝试使用LEFT OUTER JOIN本身,但我返回零记录,我知道它们存在。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可能希望使用e 公用表表达式(有关详细信息,请参阅此链接:https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx)或第一个子查询的临时表。

第二个可以存储在变量中,不需要定义为子查询(因此它只会被执行一次)

declare @MaDate DateTime 
select @MaDate = MAX([date])  from dbo.TimeSheetReport AS c  where c.[Load Date] = @ddlstartDate

SELECT     a.Userid, a.Date, a.[Total Hrs], a.[Load Date],
                  c.[First Name], c.[Last Name] 
FROM         dbo.TimeSheetReport AS a 
 INNER JOIN   Candidates AS c ON a.Userid = c.Userid 
        AND a.Date >= c.[Confirmed Start Date] 
        AND (a.Date <= c.[Planned End Date] or c.[Planned End Date] is null)
WHERE a.[Load Date] = @ddlendDate 
    AND a.Date not in 
        (select b.Date from dbo.TimeSheetReport AS b 
         where b.[Load Date] = @ddlstartDate and a.Userid = b.Userid)
    AND a.Date < @MaDate

答案 1 :(得分:0)

将NOT IN转换为NOT EXISTS将查询执行时间从12+分钟缩短到10秒以下。

Apples  Name1,Name5
Pears   Name2,Name3