Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Реально ли написать такой запрос ?  [new]
kim-kong
Member

Откуда:
Сообщений: 151
Найти все маршруты с количеством пересадок не более 2 между двумя заданными городами.

Понятно, что если есть рейсы из А в Б и из Б в С, то можно долететь из А в С с пересадкой. Мне же не понятно что конкретно нужно селектить. По какому принципу осуществлять выбор маршрута ?

К сообщению приложен файл. Размер - 22Kb
30 май 12, 22:47    [12640575]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли написать такой запрос ?  [new]
qwerty112
Guest
declare @marshrut table (vzlet char, posadka char)

insert into @marshrut

select 'A', 'B' union all
select 'B', 'C' union all
select 'C', 'D' union all
select 'A', 'D' union all
select 'D', 'C' union all
select 'B', 'E' union all
select 'E', 'C'

;with cte as
(select vzlet, posadka, 1 as [level], cast('-'+vzlet+'-'+posadka+'-' as varchar(max)) as path
from @marshrut

union all

select cte.vzlet, m.posadka, cte.[level]+1, cte.path+m.posadka+'-' 
from @marshrut m inner join cte
  on cte.posadka=m.vzlet
where cte.path not like '%-'+m.posadka+'-%')

select * from cte
order by [level], vzlet

vzlet posadka level       path
----- ------- ----------- --------------
A     B       1           -A-B-
A     D       1           -A-D-
B     C       1           -B-C-
B     E       1           -B-E-
C     D       1           -C-D-
D     C       1           -D-C-
E     C       1           -E-C-
A     C       2           -A-B-C-
A     E       2           -A-B-E-
A     C       2           -A-D-C-
B     D       2           -B-C-D-
B     C       2           -B-E-C-
E     D       2           -E-C-D-
A     D       3           -A-B-C-D-
A     C       3           -A-B-E-C-
B     D       3           -B-E-C-D-
A     D       4           -A-B-E-C-D-

(17 row(s) affected)
30 май 12, 23:47    [12640686]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли написать такой запрос ?  [new]
kim-kong
Member

Откуда:
Сообщений: 151
А если там не varchar, а id типа integer ?

with cte as
(select id_vzlet, id_posadka, 1 as [level], cast('-'+id_vzlet+'-'+id_posadka+'-' as integer(max)) as path
from marshrut

union all

select cte.id_vzlet, m.id_posadka, cte.[level]+1, cte.path+m.id_posadka+'-' 
from marshrut m inner join cte
  on cte.id_posadka=m.id_vzlet
where cte.path not like '%-'+m.id_posadka+'-%')

select * from cte
order by [level], id_vzlet
31 май 12, 00:48    [12640822]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли написать такой запрос ?  [new]
aleks2
Guest
При поиске ОГРАНИЧЕННОГО набора пересадок - рекурсия абсолютное зло. Проще надо быть.

declare @marshrut table (vzlet char, posadka char)

insert into @marshrut

select 'A', 'B' union all
select 'B', 'C' union all
select 'C', 'D' union all
select 'A', 'D' union all
select 'D', 'C' union all
select 'B', 'E' union all
select 'E', 'C'

declare @from char, @to char

select @from = 'A', @to = 'C'
 
;with
 Zero (vzlet1, posadka1) as (
   select vzlet, posadka from @marshrut where vzlet = @from and posadka = @to
 )
 , 
 One (vzlet1, posadka1, vzlet2, posadka2) as(
   select t1.*, t2.* from @marshrut t1 inner join @marshrut t2 on t1.posadka = t2.vzlet where t1.vzlet = @from and t2.posadka = @to
 )
 , 
 Two(vzlet1, posadka1, vzlet2, posadka2, vzlet3, posadka3) as (
   select t1.*, t2.*, t3.* from @marshrut t1 inner join @marshrut t2 on t1.posadka = t2.vzlet  join @marshrut t3 on t2.posadka = t3.vzlet where t1.vzlet = @from and t3.posadka = @to
 )
 select *
 from (
 select '-' [Взлет1],  '-' [Посадка1], '-' [Взлет2],'-' [Посадка2],'-' [Взлет3],'-' [Посадка3]
 union all
 select *, '-','-','-','-' from Zero
 union all
 select *, '-','-' from One
union all
 select * from Two
) X
where [Взлет1]<>'-'
31 май 12, 05:44    [12641066]     Ответить | Цитировать Сообщить модератору
 Re: Реально ли написать такой запрос ?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Это разве не тестовые задачи ?
31 май 12, 08:47    [12641253]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить