用一条SQL语句我不会:
1.直接到达地航线:
select 出发地,目的地
from tablename
where 出发地=city1 and 目的地=city2
2.通过一个中转地:
select a.出发地,a.目的地,b.目的地
from tablename a,tablename b
where a.出发地=city1 and b.目的地=city2 and a.目的地=b.出发地
3.通过两个中转地:
select a.出发地,a.目的地,b.目的地,c.目的地
from table a,table b,table c
where a.出发地=city1 and c.目的地=city2 and a.目的地=b.出发地 and
      b.目的地=c.出发地 and b.目的地<>c.出发地(避免在双向直达地城市之间循环来往)
依次类推,最后可以用union将结果连起来

解决方案 »

  1.   

    用prolog就简单了,要用SQL来实现,也要按照prolog的算法实现。
      

  2.   

    楼上的,举个用的prolog例子看看
      

  3.   

    找了个过去做过的 :-)CREATE PROCEDURE cityroute 
    (@current char(20), @dest char(20), @maxlevel int = 5) AS
    SET NOCOUNT ON
    DECLARE @level int
    CREATE TABLE #Temp (city char(20), level int)
    CREATE TABLE #list (city char(20), level int)
    INSERT #Temp VALUES (@current, 1)
    SELECT @level = 1WHILE @level > 0
    BEGIN
       IF EXISTS (SELECT * FROM #Temp WHERE level = @level)
          BEGIN
             SELECT @current = city
             FROM #Temp
             WHERE level = @level
             DELETE FROM #Temp 
             WHERE level = @level 
                AND city = @current
             DELETE FROM #list 
             WHERE level >= @level
             IF EXISTS (SELECT * FROM #list WHERE city = @current)
                CONTINUE
             INSERT #list VALUES(@current, @level)
             IF(@current = @dest)
             BEGIN
                SELECT city AS itinerary
                FROM #list
                CONTINUE
             END         INSERT #Temp
             SELECT destination, @level + 1
             FROM flights
             WHERE departure = @current
                AND @level < @maxlevel
             IF @@rowcount > 0
                SELECT @level = @level + 1
          END
       ELSE
          SELECT @level = @level - 1
    END