SQL Server查询查找从城市A到城市B的所有路由与转移
发布时间:2020-12-12 08:43:22 所属栏目:MsSql教程 来源:网络整理
导读:在面试开发者职位时,我被问到这个问题. 任务:将航空路线存储在SQL Server表写入查询中,将查找从A城市到B城市的所有路线,无需转移,即可进行一次或两次转移.例如你有路线: | From | To----------------------Los Angeles London Los Angeles New YorkNew York
在面试开发者职位时,我被问到这个问题.
任务:将航空路线存储在SQL Server表写入查询中,将查找从A城市到B城市的所有路线,无需转移,即可进行一次或两次转移.例如你有路线: | From | To ---------------------- Los Angeles London Los Angeles New York New York London Los Angeles Seattle Seattle Paris Paris London 你需要找到从洛杉矶到伦敦的所有路线.结果应该是这样的 Route ------------------------ Los Angeles->London Los Angeles->New York->London Los Angeles->Seattle->Paris->London 我的解决方案是这样的 select [From] + '->' + [To] as [Route] from Routes where [From] = 'Los Angeles' and [To] = 'London' union select r1.[From] + '->' + r1.[To] + '->' + r2.[To] as [Route] from Routes as r1 join Routes as r2 on r1.[To] = r2.[From] where r1.[From] = 'Los Angeles' and r2.[To] = 'London' union select r1.[From] + '->' + r1.[To] + '->' + r2.[To] + '->' + r3.[To] as [Route] from Routes as r1 join Routes as r2 on r1.[To] = r2.[From] join Routes as r3 on r2.[To] = r3.[From] where r1.[From] = 'Los Angeles' and r3.[To] = 'London' 工作但看起来不是很好,如果我们需要找到3,4,5或更多的转移路线,我们需要添加更多复杂选择的新工会. 对于这个特定的例子,这是很好的,因为人们对于超过2次转机的航班不感兴趣.但一般来说,我认为这个查询可以看起来更好.也许有人可以用更一般的查询来解决这个任务.谢谢. 解决方法对,您为所有RDB提供了工作通用的SQL解决方案.我看到你有一个提示 – SQL Server.它支持可用于解决此任务的递归CTE.with RoutesCTE as ( select CAST([From] + '->' + [To] as nvarchar(max)) as [Route],0 as TransfersCount,[From],[To] from Routes union all select r.[Route] + '->' + r1.[To],TransfersCount + 1,r.[From],r1.[To] from RoutesCTE r join Routes r1 on r.[To] = r1.[From] and r1.[To] <> r.[From] and PATINDEX('%'+r1.[To]+'%',r.[Route]) = 0 ) select [Route] from RoutesCTE where [From] = 'Los Angeles' and [To] = 'London' and TransfersCount <= 2 所以,这里你有一个SQL Server的一般解决方案,你可以通过传递计数过滤它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |