0

SQL Server について質問があります。次の表があります。

ROUTES = the route ID
STATIONS = the station ID
ORDER = the order the train pass from the stations
STOPS? = if the train stops at this station then is equal to 1 otherwise 0

サンプルデータ:

-----------------------------------------------------
ROUTES      STATIONS    ORDER       STOPS?
-----------------------------------------------------
R1          S1          1           1
R1          S2          2           1
R1          S3          3           1
R1          S4          4           1
R1          S5          5           1
R2          S2          1           1
R2          S3          2           1
R2          S4          3           1
R3          S1          1           1
R3          S2          2           1
R3          S7          3           1
R3          S4          4           1
R3          S5          5           1
R3          S6          6           1
R4          S1          1           1
R4          S2          2           1
R4          S3          3           0
R4          S4          4           1
R5          S2          1           1
R5          S3          2           0
R5          S4          3           1
R6          S3          1           1
R6          S4          2           0
R6          S5          3           0
R6          S6          4           1
R7          S2          1           1
R7          S3          2           0
R7          S4          3           0
R7          S5          4           1

したがって、次のルートがあると結論付けています。

R1: S1-S2-S3-S4-S5
R2: S2-S3-S4
R3: S1-S2-S7-S4-S5-S6
R4: S1-S2-S3-S4
R5: S2-S3-S4
R6: S3-S4-S5-S6
R7: S2-S3-S4-S5

S2 と S4 が接続ステーションであると仮定しましょう

これは、ルートからの列車がそこに停車する場合 (STOPS=1)、乗客は列車を降りて、別のルートから別の列車に乗ることができることを意味します。

接続駅を記載した表があります

conn_stations
--------------
S2
S4

私の質問は、たとえば駅 S1 から出発して駅 S5 に到着するルートのすべての可能な組み合わせを取得するにはどうすればよいかということです。乗客は、上記のデータに従ってルートを変更できます。次の結果 (ルート) を取得する必要があります。

R1:     S1-S2-S3-S4-S5
R3:     S1-S2-S7-S4-S5
temp1:  S1-S2(from R1)-S7-S4-S5(from R3)
temp2:  S1-S2(from R3)-S3-S4(from R1)-S5(from R3)
temp3:  S1-S2-S3-S4(from R1)-S5(from R3)
e.t.c

何を求めているのか理解していただければ幸いです。

2 つのステーション間の距離を示す表があると、どのステーションが接続されているかも示されます。

Station A   Station B   Distance
-------------------------------------
S1          S2          5
S2          S3          1
S2          S7          8
S3          S4          15
S4          S5          16
S5          S6          25
S7          S4          10
4

2 に答える 2

0

接続駅と終着駅の間の中間駅をすべて含めなくても済むと楽だと思いますが、直通ルートについては次のようにしました。

select sroute, sstation, sorder, eroute, estation, eorder
from
 (select route as sroute, station as sstation, order as sorder
  from path
  where station = "s1" and stops = 1) pstart inner join
 (select route as eroute, station as estation, order as eorder
  from path
  where station = "s5" and stops = 1) pend on
 pstart.sroute = pend.eroute) direct

および 1 つの接続駅を経由するルート:

SELECT sroute, sstation, sorder, 
        croute, cstation, corder,
        oroute, ostation, oorder,
        p.route , p.station, p.ORDER
FROM
    (SELECT sroute, sstation, sorder, 
                     croute, cstation, corder, 
                     p.route AS oroute, p.station AS ostation, p.ORDER AS oorder
    FROM
         (SELECT sroute, sstation, sorder, 
                 p.route AS croute, p.station AS cstation, p.ORDER AS corder
          FROM
              (SELECT route AS sroute, station AS sstation, ORDER AS sorder
               FROM path
               WHERE station = "s1" AND stops = 1
               ) pstart INNER JOIN
               path p ON 
               pstart.route = p.route INNER JOIN 
               conn_stations c ON 
               p.station = c.station
          WHERE p.stops = 1
          ) conn INNER JOIN 
          path p ON 
          conn.cstation = p.station
          WHERE p.stops = 1 AND p.route <> conn.route 
      ) conn_off INNER JOIN
        path p ON 
        conn_off.oroute = p.route
WHERE p.stops = 1 AND p.station = "s5"

ただし、接続ステーションの数は SQL に反映されるため、プログラミング ツールを使用した方がよいでしょう。

HTH

于 2012-11-20T19:22:29.847 に答える
0

サンプル データにはからS1まで39 のルートがあると思います (クエリが正しければ)。S5SQLがこの仕事に適したツールであるとは必ずしも信じていません(特に、コメントによると、ルートが双方向になる場合)。

クエリ:

declare @StartStation char(2)
declare @EndStation char(2)
select @StartStation = 'S1'
select @EndStation = 'S5'

;With PartialRoutes as (
    select Route,Station,CONVERT(varchar(max),Station) as CurrentPath,RouteOrder,1 as HasTransferred,CONVERT(varchar(max),Route) as RoutesTaken,Stop
    from
        @Routes r
    where
        r.Station = @StartStation and r.Stop = 1
    union all
    --Continue on current route
    select pr.Route,r.Station,pr.CurrentPath + '-' + r.Station,r.RouteOrder,0,RoutesTaken,r.Stop
    from
        PartialRoutes pr
            inner join
        @Routes r
            on
                pr.Route = r.Route and
                pr.RouteOrder = r.RouteOrder - 1
    union all
    --Transfers
    select r.Route,r.Station,pr.CurrentPath,r.RouteOrder,1,RoutesTaken + '-' + r.Station + '(' + pr.Route + ',' + r.Route + ')',r.Stop
    from
        PartialRoutes pr
            inner join
        @Connections c
            on
                pr.Station = c.Station
            inner join
        @Routes r
            on
                pr.Route != r.Route and
                pr.Station = r.Station
    where
        pr.HasTransferred = 0 --Prevents us transferring multiple times in a single station
            and r.Stop = 1
)
select * from PartialRoutes where Station = @EndStation and Stop=1 option (MAXRECURSION 0)

結果:

Route Station CurrentPath         RouteOrder  HasTransferred RoutesTaken
----- ------- ------------------- ----------- -------------- --------------------------
R7    S5      S1-S2-S3-S4-S5      4           0              R4-S2(R4,R7)
R3    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R7)-S4(R7,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R7)-S4(R7,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R5)-S4(R5,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R5)-S4(R5,R1)
R3    S5      S1-S2-S7-S4-S5      5           0              R4-S2(R4,R3)
R1    S5      S1-S2-S7-S4-S5      5           0              R4-S2(R4,R3)-S4(R3,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R2)-S4(R2,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R2)-S4(R2,R1)
R1    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R4-S2(R4,R1)-S4(R1,R3)
R3    S5      S1-S2-S3-S4-S5      5           0              R4-S4(R4,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R4-S4(R4,R1)
R7    S5      S1-S2-S3-S4-S5      4           0              R3-S2(R3,R7)
R3    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R7)-S4(R7,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R7)-S4(R7,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R5)-S4(R5,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R5)-S4(R5,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R4)-S4(R4,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R4)-S4(R4,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R2)-S4(R2,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R2)-S4(R2,R1)
R1    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R3-S2(R3,R1)-S4(R1,R3)
R3    S5      S1-S2-S7-S4-S5      5           0              R3
R1    S5      S1-S2-S7-S4-S5      5           0              R3-S4(R3,R1)
R7    S5      S1-S2-S3-S4-S5      4           0              R1-S2(R1,R7)
R3    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R7)-S4(R7,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R7)-S4(R7,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R5)-S4(R5,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R5)-S4(R5,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R4)-S4(R4,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R4)-S4(R4,R1)
R3    S5      S1-S2-S7-S4-S5      5           0              R1-S2(R1,R3)
R1    S5      S1-S2-S7-S4-S5      5           0              R1-S2(R1,R3)-S4(R3,R1)
R3    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R2)-S4(R2,R3)
R1    S5      S1-S2-S3-S4-S5      5           0              R1-S2(R1,R2)-S4(R2,R1)
R1    S5      S1-S2-S3-S4-S5      5           0              R1
R3    S5      S1-S2-S3-S4-S5      5           0              R1-S4(R1,R3)

たどったルートを示す列を最後に追加しました。たとえば、 route で開始し、次にroute に乗り換え、次にroute に乗り換えたことR4-S2(R4,R7)-S4(R7,R6)を意味します。R4S2R7S4R6

うまくいけば、このクエリを使用して、必要に応じて変更できます (つまり、質問の最終テーブルの関連性はまだわかりません)。

編集Stop目的の駅で列車が必要とするクエリに最終条件を追加しました。これが要件かどうかはわかりませんが、とにかくS1toの結果には影響しませS5ん。元に戻すのは簡単です。


このデータ設定に基づいて:

declare @Routes table (Route char(2) not null, Station char(2) not null,RouteOrder int not null,Stop bit not null)
insert into @Routes (Route,Station,RouteOrder,Stop) values
('R1','S1',1,1),('R1','S2',2,1),('R1','S3',3,1),('R1','S4',4,1),('R1','S5',5,1),
('R2','S2',1,1),('R2','S3',2,1),('R2','S4',3,1),
('R3','S1',1,1),('R3','S2',2,1),('R3','S7',3,1),('R3','S4',4,1),('R3','S5',5,1),('R3','S6',6,1),
('R4','S1',1,1),('R4','S2',2,1),('R4','S3',3,0),('R4','S4',4,1),
('R5','S2',1,1),('R5','S3',2,0),('R5','S4',3,1),
('R6','S3',1,1),('R6','S4',2,0),('R6','S5',3,0),('R6','S6',4,1),
('R7','S2',1,1),('R7','S3',2,0),('R7','S4',3,0),('R7','S5',4,1)

declare @Connections table (Station char(2) not null)
insert into @Connections (Station) values ('S2'),('S4')
于 2012-11-21T07:35:39.087 に答える