Мне задавали этот вопрос во время интервью для позиции разработчика.
Задача: наличие маршрутов рейса, хранящихся в таблице 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 передачами. Но в целом я думаю, что этот запрос может выглядеть лучше. Возможно, кто-то может решить эту задачу с более общим запросом. Спасибо.