删除自我加入

时间:2017-07-28 12:09:59

标签: sql sql-server tsql self-join

我有以下查询

SELECT h.*
FROM   table1 h
       LEFT JOIN table1 e
              ON e.fundno = h.fundno 
                 AND e.trantype = 'D'
                 AND e.modifiedon > h.modifiedon
WHERE  e.fundno IS NULL
       AND h.trantype != 'D' 

有没有办法避免自我加入。我知道可以使用Not Exists重写它,但我试图避免两次击中表格。

如果trantype相同,那么我们可以使用Row_Number来执行此操作..由于trantype不同,我无法找到方法。

1 个答案:

答案 0 :(得分:2)

你似乎想要非D行,而没有" D"行在laster时间修改。您可以使用窗口函数:

select h.*
from (select h.*,
             max(case when h.transtype = 'D' then modifiedon end) over (partition by fundno) as last_d_modifiedon
      from table1 h
     ) h
where (last_d_modifiedon is null or last_d_modifiedon < modifiedon) and
      h.transtype <> 'D';