如何仅加入 SQL Server 2008 中的最新记录?

esp*_*fee 1 sql t-sql sql-server sql-server-2008

我有两个表 A 和 B。表 A 可以为每个用户有多条记录。对于表 A 中的每一行,表 B 可以有多个记录。

下面是一个例子:

    Table A                 Table B
   a_id   a_key        b_id   b_key  b_AtblID
1. 6678   5778      1. 6509    5778    6678
2. 6679   5778      2. 6508    5778    6678
                    3. 6507    5778    6679
                    4. 6505    5778    6679
                    5. 6490    5778    6678
Run Code Online (Sandbox Code Playgroud)

您可以在 A 表中看到 2 条记录。一条记录在 B 表中有 3 条记录,一条记录在 B 表中有 2 条记录。

我希望我的查询从表 A 中提取记录,并从 B 表中提取最新记录。如果有意义的话,我不需要表 B 中与表 A 中的记录匹配的每条记录。这是我所拥有的示例,但我的代码从表 B 中提取了所有记录:

SELECT *
FROM A
     LEFT OUTER JOIN B
        ON b_AtblID = (
            SELECT TOP 1 b_AtblID
            FROM B 
            WHERE b_AtblID = a_id
            ORDER BY b_id DESC
        )
Run Code Online (Sandbox Code Playgroud)

我希望我的代码只为表 A 上的每一行返回一条记录,但我从表 B 中获得了所有记录。如果有人可以提供帮助,请告诉我。谢谢。

Lam*_*mak 5

您可以使用ROW_NUMBER

WITH CTE AS
(
    SELECT  *,
            RN = ROW_NUMBER() OVER(PARTITION BY b_AtblID ORDER BY b_id DESC)
    FROM dbo.TableB
)
SELECT *
FROM dbo.TableA a
INNER JOIN CTE b
    ON a.a_id = b.b_AtblID
    AND b.RN = 1
;
Run Code Online (Sandbox Code Playgroud)

或者CROSS APPLY

SELECT *
FROM dbo.TableA a
CROSS APPLY (SELECT TOP 1 *
             FROM dbo.TableB
             WHERE b_AtblID = a.a_id
             ORDER BY b_id DESC) b;
Run Code Online (Sandbox Code Playgroud)