2011-03-16 8 views
1

내가하고 싶은 재귀 쿼리에 대한 도움을 받고 싶습니다. 나는 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); 

내가 8 개 미만의 정지와 함께 더블린에서 모든 연결 항공편을 찾고 싶어요. 쿼리의 출력은 다음과 같은 3 필드 형식의 행 집합이어야합니다. [route, distance, stops] 여기서 경로 필드는 더블린에서 연결된 각 경로에서 방문한 공항에서 만들어진 문자열입니다. '-'문자로 구분 된 공항 이름 시퀀스 입니다. 그러나 전체 공항 이름 대신 첫 문자를 세 문자로 표시하여 각 문자열이 처럼 보이도록하십시오. 예를 들어, 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; 

그것은 올바른 그렇다면, 내가 다음 무엇을 할 수?

+0

은 내가 출력에 대해 무엇을 할 수 있습니다. 새 테이블을 만들어야합니까? – dali1985

답변

3

난 당신이 뭔가를 찾고 생각 :

 
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; 
+0

네, 이것이 제가 정확히 원하는 것입니다. 고맙습니다. 한 가지 더 묻습니다. Clacton을 통과하는 경로 만 선택하도록 쿼리를 수정하려면 어떻게해야합니까? – dali1985

+0

... 출발지와 목적지의 'Clacton'(출발지, 목적지) [출발지 : 출발지 및 도착지] –