1

我希望您对我想做的递归查询提供帮助。我在 DB2 中创建了这个表:

连接复位;
连接到样品;
下降表飞行;

创建表航班
 (START VARCHAR(16) 非空,
  目标 VARCHAR(16) 非空,
  距离 BIGINT 不为空    
 );
插入 FLIGHTS 值 ('Dublin','Bhogrol',5340);
插入 FLIGHTS 值('Dublin','Smallville',5500);
插入 FLIGHTS 值 ('Smallville','Seattle',1300);
插入 FLIGHTS 值 ('Smallville','Clacton',6700);
插入 FLIGHTS 值 ('Bhogrol','Moscow',2320);
插入飞行值('莫斯科','西雅图',3600);
插入 FLIGHTS 值('Bhogrol','Smallville',2950);
插入 FLIGHTS 值 ('Rome','Bhogrol',720);
插入 FLIGHTS 值 ('Clacton','Moscow',6700);
插入 FLIGHTS 值('Rome','Smallville',3050);
插入 FLIGHTS 值('Schippol','Smallville',8990);
插入 FLIGHTS 值('Seattle','Schippol',7840);
插入 FLIGHTS 值 ('Bhogrol','Clacton',1300);
插入 FLIGHTS 值 ('Bilbao','Moscow',1270);
插入 FLIGHTS 值('Smallville','Schippol',8990);

我想查找从都柏林出发的所有中转航班少于 8 个停靠点。查询的输出应该是一组具有以下 3 字段格式的行:[路线、距离、停靠点] 其中路线字段是从都柏林的每条连接路径中访问的机场构建的字符串。它是由“-”字符分隔的机场名称序列。但不是整个机场名称,而是只显示前三个字符,例如,每个字符串看起来像 Dub>Sch>Dub>Sma>Sch>Dub>Sma>Cla>Mos。属性“路由”的类型应该是 VARCHAR(40)。

我想以这种方式开始:

WITH路径(起点、终点、距离、终点)
作为(
  选择 f.start,f.destination,f.distance,0
  从航班 f
  WHERE 开始 = '都柏林'
  联合所有
  选择 p.start,f.destination,
  p.distance + f.distance, p.stops+1
  从航班 f,路径 p
  其中 p.destination = f.start AND p.stops < 8
)
选择开始,目的地,距离,停止
从路径;

是否正确?如果是,那我该怎么办?

4

1 回答 1

3

我想你正在寻找这样的东西:

WITH路径(路线、起点、目的地、距离、停靠点)
作为
(
  选择 substr(f.start,1,3) || ' > '|| substr(f.destination,1,3) 作为路线,
         f.开始,
         f.目的地,
         f.距离,
         0
  从航班 f
  WHERE 开始 = '都柏林'
  联合所有
  选择 p.route || ' > ' || substr(f.destination,1,3) 作为路线,
         f.开始,
         f.目的地,
         p. 距离 + f. 距离,
         p.stops + 1
  从航班 f
    加入路径 p ON p.destination = f.start AND p.stops < 8
)
选择路线、距离、站点
从路径;
于 2011-03-16T08:36:18.087 回答