左外连接Sql server中的性能问题

Sat*_*ish 0 sql sql-server sql-server-2012

在我的项目中,我需要在同一个表中找到基于旧版和新版的差异任务.

id     |    task   |   latest_Rev
1             A            N
1             B            N
2             C            Y
2             A            Y
2             B            Y
Run Code Online (Sandbox Code Playgroud)

预期结果:

   id       |     task   | latest_Rev   
   2               C           Y
Run Code Online (Sandbox Code Playgroud)

所以我尝试了以下查询

  Select new.* 
  from Rev_tmp nw with (nolock)
  left outer 
  join rev_tmp  old with (nolock)
  on   nw.id -1  = old.id
  and  nw.task = old.task
  and  nw.latest_rev = 'y'
  where old.task is null
Run Code Online (Sandbox Code Playgroud)

当我的表有超过20k的记录时,这个查询会花费更多的时间吗?如何减少时间?

在我的公司不允许使用子查询

Pரத*_*ீப் 5

使用LAG函数删除自联接

SELECT *
FROM   (SELECT *,
               CASE WHEN latest_Rev = 'y' THEN Lag(latest_Rev) OVER(partition BY task ORDER BY id) ELSE NULL END AS prev_rev
        FROM   Rev_tmp) a
WHERE  prev_rev IS NULL 
Run Code Online (Sandbox Code Playgroud)