ON T_P.[TO-TOWN] = T.FROM_TOWN
)
SELECT * FROM TUR_PARIS
WHERE [TO-TOWN] = 'TOULOUSE';
| Результат
| |
| TO-TOWN
| STEPS
| DISTANSE
| WAY
|
| TOULOUSE
|
|
| PARIS LYON MONTPELLIER TOULOUSE
|
| TOULOUSE
|
|
| PARIS CLERMONT-FERRAND TOULOUSE
|
| TOULOUSE
|
|
| PARIS CLERMONT-FERRAND MONTPELLIER TOULOUSE
|
Теперь мы сможем написать рекурсивный запрос решение очень сложной задачи, названной задачей коммивояжера (одна из действительных проблем исследования, на которых Edsger Wybe Dijkstra нашел первый эффективный алгоритм и получил премию Turing Award в 1972):
WITH
TUR_PARIS([TO-TOWN], STEPS, DISTANSE, WAY)
AS
( SELECT DISTINCT FROM_TOWN, 0, 0
,cast('PARIS' as VarChar(MAX))
FROM TUR
WHERE FROM_TOWN= 'PARIS'
UNION ALL
SELECT TO_TOWN, T_P.STEPS+1,
T_P. DISTANSE + T.MILES, T_P.WAY+ ' '+T.TO_TOWN
FROM TUR T INNER JOIN TUR_PARIS T_P
ON T_P.[TO-TOWN] = T.FROM_TOWN
)
SELECT TOP 1 * FROM TUR_PARIS
WHERE [TO-TOWN] = 'TOULOUSE'
ORDER BY DISTANSE;
| Результат
| |
| TO-TOWN
| STEPS
| DISTANSE
| WAY
|
| TOULOUSE
|
|
| PARIS CLERMONT-FERRAND TOULOUSE
|
Следует заметить, что TOP n - нестандартная для SQL конструкция. Перепишем запрос без её использования:
WITH
TUR_PARIS([TO-TOWN], STEPS, DISTANSE, WAY)
AS
( SELECT DISTINCT FROM_TOWN, 0, 0
,cast('PARIS' as VarChar(MAX))
FROM TUR
WHERE FROM_TOWN= 'PARIS'
UNION ALL
SELECT TO_TOWN, T_P.STEPS+1,
T_P. DISTANSE + T.MILES, T_P.WAY+ ' '+T.TO_TOWN