Join to only the “latest” record with t-sql

前端 未结 7 894
你的背包
你的背包 2020-12-08 08:28

I\'ve got two tables. Table \"B\" has a one to many relationship with Table \"A\", which means that there will be many records in table \"B\" for one record in table \"A\".<

相关标签:
7条回答
  • 2020-12-08 08:38
    SELECT *
    FROM tableA A
    OUTER APPLY (SELECT TOP 1 * 
                 FROM tableB B
                 WHERE A.ID = B.TableAID
                 ORDER BY B.RowDate DESC) as B
    
    0 讨论(0)
  • 2020-12-08 08:39

    Just for the clarity's sake and to benefit those who will stumble upon this ancient question. The accepted answer would return duplicate rows if there are duplicate RowDate in Table B. A safer and more efficient way would be to utilize ROW_NUMBER():

    Select a.*, b.* -- Use explicit column list rather than * here
    From [Table A] a
    Inner Join ( -- Use Left Join if the records missing from Table B are still required
        Select *,
            ROW_NUMBER() OVER (PARTITION BY TableAID ORDER BY RowDate DESC) As _RowNum
        From [Table B]
    ) b
    On b.TableAID = a.ID
    Where b._RowNum = 1
    
    0 讨论(0)
  • 2020-12-08 08:43

    Try using this:

        BEGIN
    
    DECLARE @TB1 AS TABLE (ID INT, NAME VARCHAR(30) )
    DECLARE @TB2 AS TABLE (ID INT, ID_TB1 INT, PRICE DECIMAL(18,2))
    
    INSERT INTO @TB1 (ID, NAME) VALUES (1, 'PRODUCT X')
    INSERT INTO @TB1 (ID, NAME) VALUES (2, 'PRODUCT Y')
    
    INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (1, 1, 3.99)
    INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (2, 1, 4.99)
    INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (3, 1, 5.99)
    
    INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (1, 2, 0.99)
    INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (2, 2, 1.99)
    INSERT INTO @TB2 (ID, ID_TB1, PRICE) VALUES (3, 2, 2.99)
    
    
    SELECT A.ID, A.NAME, B.PRICE
      FROM @TB1 A
      INNER JOIN @TB2 B ON A.ID = B.ID_TB1 AND B.ID = (SELECT MAX(ID) FROM @TB2 WHERE ID_TB1 = A.ID)
    
    
    END
    
    0 讨论(0)
  • 2020-12-08 08:45

    This will fetch the latest record with JOIN. I think this will help someone

    SELECT cmp.*, lr_entry.lr_no FROM 
    (SELECT * FROM lr_entry ORDER BY id DESC LIMIT 1) 
    lr_entry JOIN companies as cmp ON cmp.id = lr_entry.company_id
    
    0 讨论(0)
  • 2020-12-08 08:54
    select a.*, bm.MaxRowDate
    from (
        select TableAID, max(RowDate) as MaxRowDate
        from TableB
        group by TableAID
    ) bm
    inner join TableA a on bm.TableAID = a.ID
    

    If you need more columns from TableB, do this:

    select a.*, b.* --use explicit columns rather than * here
    from (
        select TableAID, max(RowDate) as MaxRowDate
        from TableB
        group by TableAID
    ) bm
    inner join TableB b on bm.TableAID = b.TableAID
        and bm.MaxRowDate = b.RowDate
    inner join TableA a on bm.TableAID = a.ID
    
    0 讨论(0)
  • 2020-12-08 08:56
    With ABDateMap AS (
        SELECT Max(RowDate) AS LastDate, TableAID FROM TableB GROUP BY TableAID
    ),
    LatestBRow As (
        SELECT MAX(ID) AS ID, TableAID FROM ABDateMap INNER JOIN TableB ON b.TableAID=a.ID AND b.RowDate = LastDate GROUP BY TableAID
    )
    SELECT columns
    FROM TableA a
    INNER JOIN LatestBRow m ON m.TableAID=a.ID
    INNER JOIN TableB b on b.ID = m.ID
    
    0 讨论(0)
提交回复
热议问题