![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
хитрый 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]А в чем задача то ?