请求解析报表中的SQL查询逻辑并拆分步骤排查问题
原SQL执行逻辑解析与分步拆解简化
一、执行逻辑直白解析
这个SQL的核心目的是:筛选出指定型号设备的最早一条注册历史记录,同时要求该设备当前的注册型号也属于同一指定范围。具体逻辑分两层执行:
内层子查询逻辑
- 表关联:以
SerialNumber(设备序列号)为关联键,左连接RegistrationHistory(注册历史表)和Registration(当前注册表)——左连接原本是要保留所有历史记录,哪怕当前表无对应数据,但后续外层过滤会剔除当前型号不在指定范围的记录,实际效果等价于内连接。 - 历史记录过滤:仅保留历史表中
StockCode(设备型号)在给定列表内的记录。 - 生成排序序号:给每个设备序列号的历史记录按
LoggedDate(记录创建时间)升序排序,生成seq序号,seq=1代表该设备最早的一条历史记录。 - 提取当前型号:将当前注册表中的设备型号命名为
CurrentStockCode,用于后续过滤。
外层查询逻辑
- 保留最早记录:仅筛选每个设备序列号的第一条历史记录(
seq=1)。 - 过滤当前型号:剔除当前型号不在指定列表的记录,最终得到同时满足「历史型号在指定范围」「当前型号在指定范围」的设备最早历史记录。
二、分步拆解简化(用于排查问题)
把原SQL拆成4步,每一步单独执行验证,可快速定位问题环节:
步骤1:验证历史表过滤结果
先确认从历史表中是否能获取正确的目标型号记录:
SELECT * FROM [SID_Repl].[dbo].[RegistrationHistory] WHERE StockCode IN ( 'E4272HL1','E4272HL2','E4272HL3','E4272H3', 'OP45200HA','OP45200HM','EOP45200HA','EOP45200HM', '4272HL1','4272HL2','4272HL3','4272H3' )
检查要点:是否包含所有目标型号的历史记录,有无多余或遗漏的型号。
步骤2:验证表关联结果
确认两张表的关联逻辑是否正确,当前型号是否能正常匹配:
SELECT rh.AccountNumber, rh.LinkedBP, rh.SerialNumber, rh.StockCode, rh.RegistrationDate, rh.CoverExpiry, rh.LoggedDate AS CoverExpiryNew, r.StockCode AS CurrentStockCode FROM [SID_Repl].[dbo].[RegistrationHistory] rh LEFT JOIN [SID_Repl].[dbo].[Registration] r ON rh.SerialNumber = r.SerialNumber WHERE rh.StockCode IN ( 'E4272HL1','E4272HL2','E4272HL3','E4272H3', 'OP45200HA','OP45200HM','EOP45200HA','EOP45200HM', '4272HL1','4272HL2','4272HL3','4272H3' )
检查要点:CurrentStockCode是否与设备序列号正确对应,若业务要求每个设备都有当前注册记录,大量NULL值即为异常。
步骤3:验证序号生成逻辑
确认每个设备的最早历史记录是否被标记为seq=1:
SELECT rh.AccountNumber, rh.LinkedBP, rh.SerialNumber, rh.StockCode, rh.RegistrationDate, rh.CoverExpiry, rh.LoggedDate AS CoverExpiryNew, ROW_NUMBER() OVER(PARTITION BY rh.SerialNumber ORDER BY rh.LoggedDate ASC) AS seq, r.StockCode AS CurrentStockCode FROM [SID_Repl].[dbo].[RegistrationHistory] rh LEFT JOIN [SID_Repl].[dbo].[Registration] r ON rh.SerialNumber = r.SerialNumber WHERE rh.StockCode IN ( 'E4272HL1','E4272HL2','E4272HL3','E4272H3', 'OP45200HA','OP45200HM','EOP45200HA','EOP45200HM', '4272HL1','4272HL2','4272HL3','4272H3' )
检查要点:按SerialNumber分组后,LoggedDate最小的记录是否对应seq=1,序号是否连续正确。
步骤4:执行最终过滤
在前面步骤验证正确的基础上,执行最终过滤逻辑:
SELECT * FROM ( -- 复制步骤3的SQL到此处 ) t WHERE t.seq = 1 AND t.CurrentStockCode IN ( 'E4272HL1','E4272HL2','E4272HL3','E4272H3', 'OP45200HA','OP45200HM','EOP45200HA','EOP45200HM', '4272HL1','4272HL2','4272HL3','4272H3' )
检查要点:最终结果是否符合业务预期,可优化点:因外层过滤了CurrentStockCode,左连接可改为内连接以提升查询性能。
内容的提问来源于stack exchange,提问作者A. Molinari
相关产品推荐
相关产品推荐

