如何通过截取字段值实现两张SQL临时表的关联?
问题解决方法
核心结论
必须截取[Tool]字段的前8位(等同于去掉末尾两位),才能和[Equid ID]实现匹配关联——因为[Equid ID]是固定8位,而[Tool]是在其核心内容基础上多了末尾两位字符,两者核心有效内容的长度完全一致。
具体SQL实现
假设字段归属如下:
#main(表Y)包含:Batch ID、Qty、tracking_interface_id(用于生成Tool)#eqm_hist(表X)包含:equip_id(用于生成Equid ID)、WS Name
可以直接在关联条件中完成字段截取,无需额外生成冗余中间字段,示例SQL如下:
SELECT y.[Batch ID], y.[Qty], -- 保留原Tool字段的完整值 RTRIM(y.tracking_interface_id) AS [Tool], x.[WS Name] FROM #main y JOIN #eqm_hist x -- 核心关联逻辑:取Tool前8位匹配Equid ID ON SUBSTRING(RTRIM(y.tracking_interface_id), 1, 8) = SUBSTRING(TRIM(x.equip_id), 1, 8)
如果需要提前生成[Equid ID]和[Tool]字段(方便后续复用),也可以采用以下两种方式:
方式1:先更新临时表生成字段
-- 给#eqm_hist添加并填充Equid ID字段 ALTER TABLE #eqm_hist ADD [Equid ID] VARCHAR(8); UPDATE #eqm_hist SET [Equid ID] = SUBSTRING(TRIM(equip_id), 1, 8); -- 给#main添加并填充Tool字段 ALTER TABLE #main ADD [Tool] VARCHAR(10); -- 假设原字段长度为10(8位核心+2位后缀) UPDATE #main SET [Tool] = RTRIM(tracking_interface_id); -- 执行关联查询 SELECT y.[Batch ID], y.[Qty], y.[Tool], x.[WS Name] FROM #main y JOIN #eqm_hist x ON SUBSTRING(y.[Tool], 1, 8) = x.[Equid ID];
方式2:用子查询封装字段处理逻辑
SELECT y_sub.[Batch ID], y_sub.[Qty], y_sub.[Tool], x_sub.[WS Name] FROM ( SELECT [Batch ID], [Qty], RTRIM(tracking_interface_id) AS [Tool] FROM #main ) y_sub JOIN ( SELECT SUBSTRING(TRIM(equip_id), 1, 8) AS [Equid ID], [WS Name] FROM #eqm_hist ) x_sub ON SUBSTRING(y_sub.[Tool], 1, 8) = x_sub.[Equid ID];
注意事项
- 确保
tracking_interface_id和equip_id格式统一:已用RTRIM/TRIM处理空格,若存在特殊字符需额外清洗 - 根据业务需求选择关联类型:若需保留
#main中所有数据(即使无匹配的#eqm_hist记录),将JOIN替换为LEFT JOIN即可
内容的提问来源于stack exchange,提问作者sheesh
相关产品推荐
相关产品推荐

