0

駅に発着するバスの情報が入ったDBがあります。私のアプリケーションでは、ユーザーが選択した駅からのすべての出発を表示する必要があります。

つまり、選択した駅を通過する各路線を特定する必要があります。私は次のクエリでそれを行いました:

SELECT DISTINCT LinePaths.TimetableID 
               ,Lines.LineName AS [Line]
               ,Timetable.Heading
               ,LinePaths.Departure
               ,Regime.Name AS [Regime]
FROM            LinePaths
INNER JOIN Timetables ON Timetables.TimetableID = LinePaths.TimetableID
INNER JOIN Lines ON Timetable.LineID = Lines.LineID
INNER JOIN Stations ON LinePaths.Station = Station.StationID
INNER JOIN Regimes ON Timetables.Regime = Regimes.RegimeID
WHERE Station = @Station

問題は、代わりにTimetable.Headingバスが向かう最終駅の名前を表示する必要があることです。これらは、私が自由に使用できるテーブルのスキーマです。

  • Stations - ID, Name
  • Lines - LineID, LineName
  • Timetable - TimetableID, LineID, Heading, Regime (Regimeバスが運行する曜日を定義します)
  • LinePaths - ID, TimetableID, SN, Arrival, Departure, StationID(SNは、特定のパス上のステーションの順序を定義するシリアル番号です (バスはその特定の順序でそれらのステーションに到着します)。)

したがって、代わりに がTimetable.Heading必要でありStations.Name、ここで問題になります。

その列は、バスが行く最終駅を表す必要があるため (路線ごとに)、最終駅を特定する必要があります (ここでも、選択した駅を通過する路線ごとに)。そのためには、LinePathsテーブルを使用する必要があります。そのテーブル内では、データは によってグループ化されTimetableIDているため、 の同じ値を持つエントリは、バスが駅に到着する順序を表す値 (次のように: )TimetableIDによって順序付けられます。時刻表へ は StationID の駅に に到着し、 に出発します。その駅はこのルートの駅です (は の ID であり、このクエリでは重要ではありません)。SNxxxxx, 1111, 3, 8:15, 8:20, 999911118:1599998:203rdxxxxxLinePath

最後に、私の質問は、SQL を使用して次のスキーマのデータを取得するにはどうすればよいかということです。

  • FinalStationName
  • Departure(from selected station)
  • Regime.
4

1 に答える 1

1

最も効率的な方法は、TimetableIDと最終ステーションの名前を持つ新しいテーブルを作成し、このテーブルを他のテーブルと結合することですが、追加のテーブルなしで値を取得する必要がある場合は、新しいテーブルを使用して最終ステーションを計算します。各時刻表の駅。このクエリは、各時刻表のIDと最後の駅の名前を取得します

SELECT li.TimetableID, s.Name
FROM LinePaths li INNER JOIN
    (SELECT TimetableID, max(SN) as SN FROM LinePaths) as aux
ON aux.TimetableID = li.TimetableID AND aux.SN = li.SN
INNER JOIN Stations s
ON s.ID = li.StationID

これをサブクエリとして使用し、TimetableIDを介してクエリに結合することができます。最も効率的なことではありませんが、機能するはずです。

于 2012-05-28T13:21:27.047 に答える