代码之家  ›  专栏  ›  技术社区  ›  Ryan

连接两个表,其中在另一个表上选择最高值

  •  0
  • Ryan  · 技术社区  · 9 年前

    WITH CTE AS 
    (
        SELECT DocNum, Status 
        FROM TableB 
        WHERE Id = (SELECT MAX(Id) FROM  TableB)
    )
    SELECT  TableA.DocNum, DocTitle, cte.Status
    FROM TableA
    INNER JOIN cte 
    ON TableA.DocNum = cte.DocNum
    

    示例如下:

    Table A
        Id DocNum  DocTitle
        1  ST-0001 SomeTitle
        2  ST-0002 SomeTitle
        3  ST-0003 SomeTitle
        4  ST-0004 SomeTitle
        5  ST-0005 SomeTitle
    
    Table B
        Id DocNum Status
        1  ST-0001 Incomplete
        2  ST-0001 Complete
        3  ST-0002 Complete
        4  ST-0003 Incomplete
        5  ST-0004 Incomplete
        6  ST-0004 Complete 
        7  ST-0005 Incomplete   
    
    Result
        DocNum DocTitle Status
        ST-0001 SomeTitle Complete  
        ST-0002 SomeTitle Complete  
        ST-0003 SomeTitle Incomplete  
        ST-0004 SomeTitle Complete  
        ST-0005 SomeTitle Incomplete
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   Zohar Peled    9 年前

    您可以使用具有Row_number的CTE从tableB中仅获取每个docNum具有最大id的行,然后加入该CTE。

    首先,创建并填充样本表( 请在您未来的问题中为我们保留此步骤):

    DECLARE @A As Table
    (
        Id int,
        DocNum char(7),
        DocTitle varchar(20)
    );
    
    DECLARE @B As Table
    (
        Id int,
        DocNum char(7),
        [Status] varchar(20)
    );
    
    INSERT INTO @A VALUES
    (1, 'ST-0001', 'SomeTitle'),
    (2, 'ST-0002', 'SomeTitle'),
    (3, 'ST-0003', 'SomeTitle'),
    (4, 'ST-0004', 'SomeTitle'),
    (5, 'ST-0005', 'SomeTitle');
    
    INSERT INTO @B VALUES
    (1, 'ST-0001', 'Incomplete'),
    (2, 'ST-0001', 'Complete'),
    (3, 'ST-0002', 'Complete'),
    (4, 'ST-0003', 'Incomplete'),
    (5, 'ST-0004', 'Incomplete'),
    (6, 'ST-0004', 'Complete'),
    (7, 'ST-0005', 'Incomplete');
    

    ;WITH CTE AS
    (
        SELECT  Id, 
                DocNum, 
                [Status],
                ROW_NUMBER() OVER(PARTITION BY DocNum ORDER BY Id DESC) As Rn
        FROM @B
    )
    

    SELECT A.DocNum, A.DocTitle, CTE.[Status]
    FROM @A A 
    INNER JOIN CTE ON A.DocNum = CTE.DocNum
    WHERE CTE.rn = 1
    

    结果:

    DocNum      DocTitle    Status
    ST-0001     SomeTitle   Complete  
    ST-0002     SomeTitle   Complete  
    ST-0003     SomeTitle   Incomplete  
    ST-0004     SomeTitle   Complete  
    ST-0005     SomeTitle   Incomplete
    

    You can see a live demo on rextester.

    推荐文章