无日期字段下,如何获取关联子表Table2的最后插入记录及状态?
获取每个箱子的最新状态
问题背景
现有两张主键为uniqueidentifier类型且无日期字段的表:
- Table1:存储箱子编号等基础信息
- Table2:用于箱子状态的历史追踪,每次状态变更新增一行记录,通过
Table1_FK_ID与Table1关联
状态值含义:0-新建、10-已批准、20-已拒绝、30-已锁定
需求:查询每个箱子对应的Table2中最后插入记录的状态,结果集需包含BoxNum和Status字段。
表结构
Table1
| 列名 | 数据类型 |
|---|---|
| Id | uniqueidentifier |
| BoxNum | nvarchar(25) |
Table2
| 列名 | 数据类型 |
|---|---|
| Id | uniqueidentifier |
| status | int |
| Table1_FK_ID | uniqueidentifier |
解决方案
由于无日期字段,我们依赖Table2.Id(主键,若为NEWSEQUENTIALID()生成,其值递增顺序与插入顺序一致)来判断最后插入的记录。
方案1:窗口函数ROW_NUMBER()
SELECT t1.BoxNum, t2.Status FROM Table1 t1 LEFT JOIN ( SELECT Table1_FK_ID, status AS Status, ROW_NUMBER() OVER (PARTITION BY Table1_FK_ID ORDER BY Id DESC) AS rn FROM Table2 ) t2 ON t1.Id = t2.Table1_FK_ID AND t2.rn = 1
- 按
Table1_FK_ID分组,对每组内的记录按Id降序排序,rn=1即为该箱子的最新状态记录 - 使用
LEFT JOIN可保留无状态记录的箱子(此时Status为NULL),若只需有状态的箱子,替换为INNER JOIN即可
方案2:关联子查询
SELECT t1.BoxNum, (SELECT TOP 1 status FROM Table2 t2 WHERE t2.Table1_FK_ID = t1.Id ORDER BY t2.Id DESC) AS Status FROM Table1 t1
- 针对每个箱子,子查询返回Table2中对应
Id最大的记录的状态 - 无状态记录的箱子,
Status字段将返回NULL
示例输出
| BoxNum | Status |
|---|---|
| 444444 | 10 |
| 444445 | 20 |
| 444412 | 30 |
内容的提问来源于stack exchange,提问作者Danijel Boksan
相关产品推荐
相关产品推荐

