항공편 데이터로 여행 계획하기

SQL Server에서의 계층형 및 재귀 쿼리

Jasmin Ludolf

Content Developer

공항 전광판

공항의 예시 전광판

SQL Server에서의 계층형 및 재귀 쿼리

항공편 데이터셋은 어떻게 구성되나요?

Departure Arrival FlightNumber Cost Time
London Paris LH3827 90 2
Vienna New York MH2370 379 8
New York Paris LH9832 489 9
Vienna Paris SU2389 200 3
London Chicago OP1230 650 10
New York Chicago NL5460 150 2
SQL Server에서의 계층형 및 재귀 쿼리

항공편 경로를 어떻게 만들까요?

전 세계 가능한 항공편 경로를 보여주는 이미지

  • 재귀로 가능한 모든 항공편 경로 계산
  • 경로는 출발지와 도착지로 정의
  • 현실적인 경로를 위해 경유 횟수 제한
SQL Server에서의 계층형 및 재귀 쿼리

항공편 경로 만들기 - 단계 1

WITH flightRoute (Departure, Arrival, stops) AS(
  -- Anchor query
  SELECT f.Departure,f.Arrival, 0
      FROM flightPlan f
      WHERE Departure = 'Vienna'
  -- Recursive query
  UNION ALL
      SELECT p.Departure, f.Arrival, p.stops + 1
      FROM flightPlan f, flightRoute p
      WHERE p.Arrival = f.Departure AND 
        p.stops < 5 
)
SELECT Departure, Arrival, stops
    FROM flightRoute
+-----------+---------------+--------+
| Departure | Arrival       | stops  |
|-----------|---------------|--------|
| Vienna    | Paris         | 2      |
| Vienna    | San Francisco | 3      |
| Vienna    | Vienna        | 3      |
| Vienna    | Frankfurt     | 3      |
| ...       | ...           | ...    |
+-----------+---------------+--------+
SQL Server에서의 계층형 및 재귀 쿼리

항공편 경로 만들기 - 단계 2

WITH flightRoute (Departure, Arrival, stops, route) AS(
  SELECT f.Departure, f.Arrival, 0, 
  CAST(Departure + '->' + Arrival AS VARCHAR(MAX))
      FROM flightPlan f
      WHERE Departure = 'Vienna'

UNION ALL SELECT p.Departure, f.Arrival, p.stops + 1, p.totalCost + f.Cost, CAST(p.route + '->' + f.Arrival AS VARCHAR(MAX)) FROM flightPlan f, flightRoute p
WHERE p.Arrival = f.Departure AND p.stops < 5 )
  • 앵커 멤버에 route 추가

  • 재귀 멤버에서 route 추적

  • 경유지 수 제한

SQL Server에서의 계층형 및 재귀 쿼리

항공편 경로 만들기 - 결과

SELECT Departure, Arrival, Route
    FROM flightRoute
+-----------+--------------+-------------------------------------------+
| Departure | Arrival      | route                                     |
|-----------|--------------|-------------------------------------------+
| London    | New York     | London -> Vienna -> Chicago -> New York   |
| Vienna    | Chicago      | Vienna -> London -> Chicago               |        
| Paris     | Los Angeles  | Paris -> Toronto -> Los Angeles           |
| Chicago   | New York     | Chicago -> New York                       |
| Rome      | New York     | Rome -> London -> Chicago -> New York     |    
| ...       | ...          | ...                                       |
+-----------+--------------+-------------------------------------------+
SQL Server에서의 계층형 및 재귀 쿼리

제한 조건으로 가능한 항공편 조회

WITH flightRoute (Departure, Arrival, stops, totalCost, route) AS(
  SELECT f.Departure, f.Arrival, 0, Cost,
    CAST(Departure + '->' + Arrival AS NVARCHAR(MAX))
      FROM flightPlan f
      WHERE Departure = 'New York'
  UNION ALL
  SELECT  p.Departure, f.Arrival, p.stops+1, 
  p.totalCost + f.Cost, p.route + '->' + f.Arrival
      FROM flightPlan f, flightRoute p
      WHERE p.Arrival = f.Departure AND p.stops < '...' 
)
SELECT '...'    
    FROM flightRoute
    WHERE '...' ;

다음 조건을 만족하는 모든 도착 공항 찾기:

  • 출발 공항 고정
    • New York
  • stops 수를 n으로 제한
  • 결과를 조건으로 제한
    • 비용 한도
    • 특정 도착지로의 최저가 경로
SQL Server에서의 계층형 및 재귀 쿼리

가능한 항공편 경로를 찾아봅시다!

SQL Server에서의 계층형 및 재귀 쿼리

Preparing Video For Download...