ここでは、複数のシード文および再帰文を使用する再帰的問合わせの例を示します。
以下の2つのテーブルがあるとします。
CREATE TABLE planes ( depart VARCHAR(40), arrive VARCHAR(40), carrier VARCHAR(40), cost DECIMAL(5,0)); CREATE TABLE trains ( depart VARCHAR(40), arrive VARCHAR(40), cost DECIMAL(5,0));
planesテーブルのデータは次のとおりです。
Depart | Arrive | Carrier | Cost |
---|---|---|---|
Paris | New York | AA | 199 |
Paris | London | AA | 99 |
London | New York | AA | 199 |
New York | Mexico City | UA | 99 |
Mexico City | New York | UA | 99 |
Paris | Mexico City | AF | 299 |
New York | London | AA | 199 |
New York | Tokyo | JAL | 999 |
Mexico City | Tokyo | JAL | 999 |
Tokyo | New York | JAL | 999 |
trainsテーブルのデータは次のとおりです。
Depart | Arrive | Cost |
---|---|---|
Paris | London | 99 |
London | Paris | 99 |
Paris | Milan | 199 |
London | Milan | 199 |
Milan | Paris | 199 |
Milan | Rome | 49 |
Rome | Florence | 49 |
以下の問合わせは、2つのシード文、および2つの再帰文を使用することによって、列車(train)または飛行機(plane)でパリ(Paris)から到達可能なすべての都市を返します。
WITH RECURSIVE temp_table (depart, arrive, carrier, depth) AS ( SELECT p_root.depart, p_root.arrive, p_root.carrier, 0 AS depth FROM planes p_root WHERE p_root.depart = 'Paris' UNION ALL SELECT t_root.depart, t_root.arrive, 'EuroRail', 0 AS depth FROM trains t_root WHERE t_root.depart = 'Paris' UNION ALL SELECT direct.depart, indirect.arrive, indirect.carrier, direct.depth+1 FROM temp_table AS direct, planes AS indirect WHERE direct.arrive = indirect.depart AND indirect.arrive <> 'Paris' AND direct.depth <= 4 UNION ALL SELECT direct.depart, indirect.arrive, 'EuroRail', direct.depth+1 FROM temp_table AS direct, trains AS indirect WHERE direct.arrive = indirect.depart AND indirect.arrive <> 'Paris' AND direct.depth <= 4) ) SELECT DISTINCT arrive (TITLE 'Destinations Reachable From Paris') FROM temp_table;
この再帰的問合わせの結果セットは次のとおりです。
Destinations Reachable From Paris ---------------------------------------- Florence London Mexico City Milan New York Rome Tokyo