рекурсивный запрос - PullRequest
       3

рекурсивный запрос

1 голос
/ 16 марта 2011

Мне нужна ваша помощь по поводу рекурсивного запроса, который я хочу сделать.Я создал эту таблицу в DB2:

connect reset;
connect to sample;
DROP TABLE FLIGHTS;

CREATE TABLE FLIGHTS
 (START         VARCHAR(16)     NOT NULL,
  DESTINATION   VARCHAR(16)     NOT NULL,
  DISTANCE  BIGINT          NOT NULL    
 );
insert into FLIGHTS values ('Dublin','Bhogrol',5340);
insert into FLIGHTS values ('Dublin','Smallville',5500);
insert into FLIGHTS values ('Smallville','Seattle',1300);
insert into FLIGHTS values ('Smallville','Clacton',6700);
insert into FLIGHTS values ('Bhogrol','Moscow',2320);
insert into FLIGHTS values ('Moscow','Seattle',3600);
insert into FLIGHTS values ('Bhogrol','Smallville',2950);
insert into FLIGHTS values ('Rome','Bhogrol',720);
insert into FLIGHTS values ('Clacton','Moscow',6700);
insert into FLIGHTS values ('Rome','Smallville',3050);
insert into FLIGHTS values ('Schippol','Smallville',8990);
insert into FLIGHTS values ('Seattle','Schippol',7840);
insert into FLIGHTS values ('Bhogrol','Clacton',1300);
insert into FLIGHTS values ('Bilbao','Moscow',1270);
insert into FLIGHTS values ('Smallville','Schippol',8990);

Я хочу найти все связанные рейсы из Дублина с менее чем восемью остановками.Выходные данные запроса должны представлять собой набор строк в следующем формате из 3 полей: [маршрут, расстояние, остановки], где поле маршрута представляет собой строку, составленную из аэропортов, посещенных на каждом соединенном пути из Дублина.Это последовательность имен аэропортов, разделенных символом «-».Но вместо полного названия аэропорта просто покажите первые три символа, чтобы каждая строка выглядела, например, как Dub> Sch> Dub> Sma> Sch> Dub> Sma> Cla> Mos.Тип атрибута 'route' должен быть VARCHAR (40).

Я подумал начать таким образом:

WITH path (start, destination, distance, stops)
AS(
  SELECT f.start, f.destination, f.distance, 0
  FROM flights f
  WHERE start = 'Dublin'
  UNION ALL
  SELECT p.start, f.destination,
  p.distance + f.distance, p.stops+1
  FROM flights f, path p
  WHERE p.destination = f.start AND p.stops < 8 
)
SELECT start, destination, distance, stops 
FROM path;

Правильно ли это?

1 Ответ

3 голосов
/ 16 марта 2011

Я думаю, вы ищете что-то вроде этого:

WITH path (route, start, destination, distance, stops)
AS
(
  SELECT substr(f.start,1,3) || ' > '|| substr(f.destination,1,3) as route,
         f.start, 
         f.destination,
         f.distance, 
         0
  FROM flights f
  WHERE start = 'Dublin'
  UNION ALL
  SELECT p.route || ' > ' || substr(f.destination,1,3) as route,
         f.start,
         f.destination,
         p.distance + f.distance, 
         p.stops + 1
  FROM flights f
    JOIN path p ON p.destination = f.start AND p.stops < 8 
)
SELECT route, distance, stops 
FROM path;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...