下面的SQL查询有效,但由于使用了子查询,因此需要永久响应。我希望有人能为我找到优化此查询的方法。
data[i]
每个数据子集都是根据加载数据的时间(即加载日期)创建的。它查找当前加载(@ddlendDate)中从先前加载(@ddlstartDate)中丢失的任何日期。
我尝试使用LEFT OUTER JOIN本身,但我返回零记录,我知道它们存在。
有什么想法吗?
答案 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