LEFT Join 具有特定条件的子查询

-1 sql sql-server join

我有两张表正在尝试加入

table1
----------------------------
Id         Name         Num
123X       Apple        17

table2
-------------------------------------------------
id           EndDt         SomeVal      
123X         10/1/2021     xxx
123X         3/1/2022      yyy
Run Code Online (Sandbox Code Playgroud)

我正在尝试选择table1 a-LEFT JOIN table2 b on a.id = b.id但是,我只想选择 table2 中的 id,其中MAX(EndDt)

Select a.*, b.SomeVal
from table1 a 
    LEFT OUTER JOIN table2 b on a.id=b.id // and b.MAX(EndDt)
Run Code Online (Sandbox Code Playgroud)

类似的事情可行吗?

use*_*983 5

有几种方法可以做到这一点。不过,我对你的数据做了一些假设。

  1. 将 aLEFT JOIN与子查询一起使用:
    SELECT T1.*,
           sq.SomeVal
    FROM dbo.Table1 T1
         LEFT JOIN (SELECT ROW_NUMBER() OVER (PARTITION BY t2.Id ORDER BY t2.EndDt DESC) AS RN,
                           t2.Id,
                           t2.SomeVal
                    FROM dbo.Table2 T2) sq ON T1.Id = T2.Id
                                          AND T2.RN = 1;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用APPLYTOP
    SELECT T1.*,
           sq.SomeVal
    FROM dbo.Table1 T1
         OUTER APPLY (SELECT TOP (1)
                             t2.Id,
                             t2.SomeVal
                      FROM dbo.Table2 T2
                      WHERE T2.Id = T1.Id
                      ORDER BY T2.EndDt DESC) sq;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用 CTE 并获取每组的“前 1”行:
    WITH CTE AS(
        SELECT T1.*,
               T2.SomeVal,
               ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T2.MaxDt DESC) AS RN
        FROM dbo.Table1 T1
             LEFT JOIN dbo.Table2 T2 ON T1.Id = T2.Id)
    SELECT *
    FROM CT
    WHERE RN = 1;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用TOP (1) WITH TIES
    SELECT TOP (1) WITH TIES
           T1.*,
           T2.SomeVal
    FROM dbo.Table1 T1
         LEFT JOIN dbo.Table2 T2 ON T1.Id = T2.Id
    ORDER BY ROW_NUMBER() OVER (PARTITION BY T1.ID ORDER BY T2.MaxDt DESC) ASC;
    
    Run Code Online (Sandbox Code Playgroud)

ID请注意,如果表中不唯一,选项 3 和 4 将无法按预期工作Table1(因此是我对您的数据的假设)。