Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

хитрый sql запрос


Vlad2 ©   (2002-10-17 07:41:00) 

Здравствуйте !
Ситуация такова:
1. существует таблица "Выполнение работ на маршруте" table Route(idRoute, ...) - автобусы работают на разных маршрутах.
2. каждый маршрут имеет нач. и конечную остановки table Station(idRoute, idStationStart, idStationStop).
3. при выполнении работ на разных маршрутах нужно учесть пробег при движении от кон. остановки предыдущего маршута до нач. остановки следующего, - это таблица RunStation(idStationStart, isStationStop, run).
4. для задания порядка работ в таблице Route есть поле idOrder.

Кроме лобового решения: задать (tsql) цикл по idOrder и считать эти RunStation.run должно существовать более правильное. Это решение слишком затратно по времени. Как бы зделать это одним запросом ?


Vlad2   (2002-10-17 10:58:00) [1]

Мужики ! Меня десь не было 0.5 часа, щас буду разбираться.


pahan_s   (2002-10-17 10:49:00) [2]

примерно так, если сумарный пробег

select
sum(rs.run)
from
route ro1, route ro2, station st1, station st1,
runstation rs
where ro1.idCar=<...>
and ro2.idCar=ro1.idCar and ro2.idorder=ro1.idorder+1
and st1.idroute=ro1.idroute and st2.idroute=ro2.idroute
and rs.isStationStart=st1.isStationStop and rs.isStationStop=st2.isStationStart;


ЮЮ   (2002-10-17 10:34:00) [3]

select Route.*, RunStation.run from Route
left join Route NextRout on Route.idCar=NextRout.idCar
and Route.idOrder+1=NextRout.idOrder
and Route.Date=NextRout.Date
left join Station LastSt on Route.idRoute=Station.idStationStop
left join Station FirstSt on NextRout.idRoute=Station.idStationSart
left join RunStation on
LastSt.idStation=RunStation.idStationStart and
FirstSt.idStation=RunStation.idStationStop


pahan_s   (2002-10-17 10:22:00) [4]

Дошло, щас помозгуем


Vlad2   (2002-10-17 10:08:00) [5]

> pahan_s
В таблице работ Route поле idRoute - идентификатор маршрута. Найти для него пробег просто. Но далее выполняется следующая работа - следующая запись Route.idOrder. При этом происходит движение от кон. остановки выполненного до начальной этого следующего маршрута. Расстояния м-у остановками хранятся в RunStation(idStationStart, isStationStop, run). И для того, чтобы узнать это расстояние нужно иметь idRoute предыдущего (для определения конечной остановки) и idRoute следующего (для определения начальной). Это расстояние записывается в поле таблицы Route для первого маршрута.
Код автобуса, конечно, есть. Это Route.idCar .


pahan_s   (2002-10-17 09:50:00) [6]

что значит
...поле Route.run = [пробег от кон. остановки текущего маршрута до нач. остановки следуюшего]..., нужно вычислить только пробег на исходные позиции маршрута, или как?

а запись в Route происходит при каждом прохождении маршрута каждого автобуса?

Кстати какое поле Код Автобуса?


Vlad2   (2002-10-17 09:46:00) [7]

> dimis
RunStation содержит значение RunStation.run, относящиеся к разным (соседним в смысле Route.idOrder) записям таблицы Route. Существенен именно порядок (реально существующий) выполнения маршрутов Route.idRoute, т.к. разные пары {кон. остановка текущего маршрута, нач. остановка следующего маршрута} имеют разные пробеги.


dimis   (2002-10-17 09:36:00) [8]

хотя я и не совсем понял условие,но по-моему там
select sum(run) from RunStation
where ...
надо только выбрать маршруты относящиеся к конкретному автобусу.
не совсем понятно правда зачем при этом использовать порядок работ, может подробнее пояснишь


Vlad2   (2002-10-17 08:49:00) [9]

Замечание: обычно в таких случаях я считаю, что БД спроектирована неверно. Но в данном случае порядок выполнения работ (Route.idOrder) имеет смысл, что противоречит теории. При этом остается ощущение, что предложение sql можно сформулировать.


Vlad2   (2002-10-17 08:08:00) [10]

> Zlob
Нужно в таблице Route для каждого маршрута вычислить поле Route.run = [пробег от кон. остановки текущего маршрута до нач. остановки следуюшего]. Следующий маршрут - это запись cо следующим значением Route.idOrder. Разумеется, всё происходит в пределах одного дня.


Zlob   (2002-10-17 07:59:00) [11]

А в чем задача то ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо