MSSQL带条件循环嵌套行:中转路径备注的递归查询求助
解决方案
针对你的需求,我们可以通过递归CTE来生成传输路径并正确填充备注字段。以下是适配你数据表的完整SQL语句:
WITH TransitPaths AS ( -- 锚点查询:获取所有直接相邻的传输段(无中转) SELECT s.Id AS StartId, s.Country AS CountryFrom, e.Country AS CountryTo, s.seqNo AS SeqFrom, e.seqNo AS SeqTo, s.Send, e.Arrive, CAST('' AS NVARCHAR(MAX)) AS Remarks FROM IPhone s JOIN IPhone e ON s.seqNo + 1 = e.seqNo UNION ALL -- 递归查询:扩展路径,收集途经国家 SELECT tp.StartId, tp.CountryFrom, e.Country AS CountryTo, tp.SeqFrom, e.seqNo AS SeqTo, tp.Send, e.Arrive, CASE WHEN tp.Remarks = '' THEN tp.CountryTo ELSE tp.Remarks + ', ' + tp.CountryTo END AS Remarks FROM TransitPaths tp JOIN IPhone e ON tp.SeqTo + 1 = e.seqNo ) -- 最终结果:给非空备注添加"Via "前缀 SELECT StartId AS Id, CountryFrom, CountryTo, CONVERT(VARCHAR(4), SeqFrom) + '-' + CONVERT(VARCHAR(4), SeqTo) AS seqNo, Send, Arrive, CASE WHEN Remarks <> '' THEN 'Via ' + Remarks ELSE '' END AS Remarks FROM TransitPaths ORDER BY SeqFrom, SeqTo;
语句解释
- 锚点查询:先筛选出所有
seqNo连续的直接传输段(比如1→2、2→3),这类路径无中转,备注字段为空。 - 递归查询:基于锚点的结果,逐步扩展路径范围(比如1→2扩展为1→3,再扩展为1→4),每次将当前路径的终点国家追加到备注中,形成途经国家列表。
- 最终整理:对非空的备注字段添加
Via前缀,保持直接传输的备注为空,完全匹配你的需求。
执行结果
运行上述语句后,将得到以下符合预期的结果:
| Id | CountryFrom | CountryTo | seqNo | Send | Arrive | Remarks |
|---|---|---|---|---|---|---|
| 1001 | America | China | 1-2 | 2022-11-23 18:30:00 | 2022-11-24 05:00:00 | |
| 1002 | China | Argentina | 2-3 | 2022-11-24 08:18:00 | 2022-11-24 18:18:00 | |
| 1003 | Argentina | Saudi Arabia | 3-4 | 2022-11-25 18:30:00 | 2022-11-25 20:30:00 | |
| 1001 | America | Argentina | 1-3 | 2022-11-23 18:30:00 | 2022-11-24 18:18:00 | Via China |
| 1002 | China | Saudi Arabia | 2-4 | 2022-11-24 08:18:00 | 2022-11-25 20:30:00 | Via Argentina |
| 1001 | America | Saudi Arabia | 1-4 | 2022-11-23 18:30:00 | 2022-11-25 20:30:00 | Via China, Argentina |
原查询问题说明
你之前的查询直接连接所有seqNo小于目标值的记录,并拼接起点和终点国家作为备注,这错误地将起点、终点当成了途经点。递归CTE的核心是逐步遍历中间节点,只收集真正的途经国家,从而得到正确的备注内容。
内容的提问来源于stack exchange,提问作者Honey Singh
相关产品推荐
相关产品推荐

