如何仅加入SQL Server 2008中的最新记录?
我有两个表A和B。表A可以为每个用户提供多条记录。对于表A中的每一行,表B可以有多条记录 以下是一个例子:如何仅加入SQL Server 2008中的最新记录?,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有两个表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. 650
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
您可以在一个表中看到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
)
我希望我的代码对于表A中的每一行只返回一条记录,但我从表B中获得了所有记录。如果有人可以帮助,请告诉我。谢谢。您可以使用
行号
:
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
;
或交叉应用:
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;
您可以使用
行编号
:
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
;
或交叉应用:
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;
我在这里看到的最大问题是,这两个表之间存在多对多关系。这带来了很多挑战。如果它使用桥接表来管理这种关系,那就更好了。您能修复设计吗?b_id是b表的主键。我无法更改我的表结构。这是一个我必须维护的旧系统…你对最近记录的标准是什么
max
b_id
?我感觉到你的痛苦。你最好的选择是使用下面拉马克的答案。因为我没有任何其他字段,所以只需要拉最高的b_id。Create date存在,但如果在同一日期创建多个记录,则它们可以相同。我在这里看到的最大问题是,这两个表之间存在多对多关系。这带来了很多挑战。如果它使用桥接表来管理这种关系,那就更好了。您能修复设计吗?b_id是b表的主键。我无法更改我的表结构。这是一个我必须维护的旧系统…你对最近记录的标准是什么max
b_id
?我感觉到你的痛苦。你最好的选择是使用下面拉马克的答案。因为我没有任何其他字段,所以只需要拉最高的b_id。创建日期存在,但如果在同一日期创建多条记录,则它们可以相同。我认为您需要扩展窗口函数:ROW\u NUMBER()(按b\u键划分,b\u AbtlID按b\u id排序)
@Tyron78正如我理解的问题,我看不出有什么必要,我尝试了交叉应用解决方案,但在“;”附近不断出现错误,语法不正确@浓缩咖啡我漏掉了派生表别名,试试看now@espresso_coffee这就是为什么我发布了不止一种方法,所以你可以测试哪种方法更适合你我认为你需要扩展窗口函数:ROW\u NUMBER()(按b\u键划分,按b\u id排序)
@Tyron78正如我理解的问题,我看不出有什么必要,我尝试了交叉应用解决方案,但在“;”附近不断出现错误,语法不正确@浓缩咖啡我漏掉了派生表别名,试试看now@espresso_coffee这就是为什么我发布了不止一种方法,所以你可以测试哪一种更适合你