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 中获得了所有记录。如果有人可以提供帮助,请告诉我。谢谢。
您可以使用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)
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |