2012-05-28 3 views
0

У меня есть БД, которая содержит информацию о автобусах, прибывающих в/от станции. В моем приложении мне нужно отобразить все отклонения от станции, которую пользователь выбирает.Комплексная помощь SQL-запросов

Это означает, что я должен идентифицировать каждую линию, проходящую через выбранную станцию. Я сделал это с помощью следующего запроса:

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 (The SN является серийный номер, определяет порядок станций по определенным маршрутам (автобус будет поступать на эти станции в этом конкретном порядке).

Итак, вместо Timetable.Heading мне нужно иметь Stations.Name, и здесь я прихожу к своей проблеме.

Эта колонка должна представлять конечную станцию, к которой идет автобус (для каждой линии), поэтому мне нужно как-то идентифицировать конечную станцию ​​(снова для каждой линии, проходящей через выбранную станцию). Для этого я должен использовать таблицу LinePaths. Внутри этой таблицы данные сгруппированы по TimetableID, так что записи с одинаковым значением для TimetableID упорядочены по значению SN, которое представляет порядок, в котором шина поступает на станции (например: xxxxx, 1111, 3, 8:15, 8:20, 9999) - это означает, что автобус, что диски в соответствии с графиком 1111 прибудет в 8:15 к станции с StationID 9999, оставить на 8:20, и что станция является 3rd один на этом маршруте (The xxxxx это идентификатор LinePath, и не имеет значения для этого запроса).

Итак, наконец, мой вопрос - как я могу, используя SQL, получить данные в следующей схеме:

  • FinalStationName,
  • Departure(from selected station),
  • Regime.
+0

Что такое РСУБД? SQL Server, MySQL, PostGres, oracle? – JNK

+0

База данных находится на сервере, который использует SQL Server 2008 – NDraskovic

ответ

1

Наиболее эффективным способом было бы иметь новую таблицу с TimetableID и имя конечной станции и присоединиться к этой таблице с другими, но если вам действительно нужно получить значение без дополнительных таблиц, вы новичок, чтобы рассчитать конечную станцию ​​для каждого расписания. Этот запрос получает идентификатор каждого графика и название последней станции

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. Не самая эффективная вещь, но она должна работать.

+0

Спасибо, я попробую это.Я связался с моим клиентом, и он сказал, что скорость выполнения не является основной проблемой, потому что эти отчеты выполняются один раз в несколько месяцев, поэтому приемлемо даже несколько минут времени выполнения. – NDraskovic

+0

Мне удалось решить мою проблему с помощью только слегка скорректированного запроса , поэтому большое спасибо, я действительно застрял в этом. – NDraskovic

+0

Еще один вопрос: max (SN) не идентичен для каждого расписания (некоторые строки имеют больше остановок, чем другие) - как я могу получить max (SN) для каждого расписания? – NDraskovic