Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2016, 21:40   #1
Tormozz
 
Регистрация: 06.06.2016
Сообщений: 3
Печаль Помогите пожалуйста с SQL запросом базы данных

Задача такая - составить запрос к базе данных "Автовокзал": "Самый ранний рейс в понедельник, проходящий через Сокол. Вывести часы, минуты, название маршрута и количество свободных мест. Если таких рейсов не один, выбрать все.". Кучу вариантов запросов пересочинял, вот два похожие на правду, но нерабочие запросы:
Код:
select hour, minute, name_route, (models.places-tickets) as free_places from trips inner join routes on
routes.cod_route=trips.cod_route where week_day=1 and minute in 
(select min(minute) from trips where week_day=1 and hour in
(select min(hour) from trips where week_day=1) ) and hour in
(select min(hour) from trips where week_day=1) inner join points_routes on
points_routes.cod_route=routes.cod_route inner join points on
points.cod_point=points_routes.cod_point where name_point='Сокол' and trips.week_day=1
и
Код:
select hour, minute, name_route, ((models.places)-(trips.tickets)) as free_places  from trips 
left join buses on trips.cod_bus=buses.cod_bus 
left join models on buses.cod_model=models.cod_model 
left join routes on trips.cod_route=routes.cod_route
left join points_routes on routes.cod_route=points_routes.cod_route
left join points on points_routes.cod_point=points.cod_point 
where points.name_point='Сокол' and trips.hour=min(trips.hour) and trips.minute=min(trips.minute)
order by routes.name_route
Ниже привожу схему и свойства базы данных:


km_prices (расценки за километр)
class(класс автобуса)
price (цена за км для данного класса)
models (марки или модели автобусов)
cod_model (код, суррогатный ключ)
name_model (название, атрибут носит справочный характер)
places (количество мест в автобусах данной марки)
class (класс комфортности)
buses (автобусы)
cod_bus (код автобуса, возможно его инвентарный номер)
bus_number (номер ГИБДД, атрибут носит чисто справочный характер)
cod_model (марка автобуса, внешний ключ)
points (населенные пункты)
cod_point (код, суррогатный ключ)
name_point (название)
distance (расстояние от пункта отправления)
routes (маршруты)
cod_route (код, суррогатный ключ)
name_route (название маршрута)
points_routes (связь между пунктами и маршрутами)
cod_point (код пункта, внешний ключ)
cod_route (код маршрута, внешний ключ)
trips (рейсы)
cod_trip (код рейса, суррогатный ключ)
week_day (день недели)
hour (часы)
minute (минуты)
cod_route (код маршрута)
cod_bus (код автобуса, назначенного на данный рейс)
tickets (количество проданных билетов)

Некоторые пояснения:
Пункты и маршруты имеют связь "Многие-ко-Многим" (через каждый пункт может проходить несколько маршрутов и каждый маршрут имеет несколько остановок). Для этого служит таблица-связка points_routes.

Сущность trips (рейсы) связывает сущности Маршруты и Автобусы, дополняя их такими важными атрибутами как время отправления. Здесь же фиксируется и количество проданных билетов на каждый рейс (после отправления рейса поле обнуляется).

Дни недели в trips - числа от 1 до 7, где 1 - понедельник, 2 - вторник и т.д.

Номера и марки автобусов, названия маршрутов, названия населённых пунктов уникальны.

Допустимо наличие маршрутов, не используемых ни в одном рейсе. Могут быть населённые пункты, не используемые ни в одном маршруте, маршруты, в которые ещё не включены никакие пункты, автобусы, не задействованные ни в одном рейсе. Аналогично, в базе может содержаться марка автобуса, но не быть ни одного автобуса такой марки.
Tormozz вне форума Ответить с цитированием
Старый 07.06.2016, 13:18   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
select sroutes.name_routes, 
       trips.hour, trips.minute,
       (models.places - trips.tickets) as freeplace

from  ( select routes.name_routes
        , ( select top 1 cod_trip 
            from trips
            where trips.code_route =routes.code_route
              and week_day =1 
            order by hour, minute ) as first_trip

        from points
        inner join points_routes on pounts_routes.cod_pount =point.cod_point
        inner join routes on routes.cod_route =points_routes.cod_route
        where name_point='Sokol' 
      ) as Sroutes

inner join trips on sroutes.first_trip =trips.cod_trip
inner join buses on buses.cod_bus =trips.cod_bus
inner join models on models.cod_model =buses.cod_model
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 07.06.2016, 20:34   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

стало любопытно
получить искомое без использования ограничений вывода ( TOP 1 )

Код:
select routes.name_route, trips.houre, trips.minute,
       (models.places - trips.tickets) as freeplace
from ( -- первые минуты рейсов за первый час
       select cod_route, week_day, mhoure, min(minute) as mminute
       from ( -- первые часы рейсов в день 
              select trips.cod_route, week_day, min(hour) as mhour
              from trips
              group by cod_route, week_day 
            ) as hroute
       inner join trips on trips.cod_route =hroute.cod_route and trips.week_day =hroute.week_day and trips.hour =hroute{s}.mhour
       group by cod_route, week_day, mhoure
     ) as mroute
inner join trips on trips.cod_route =mroute.cod_route and trips.week_day =mroute.week_day and trips.hour =mroute{s}.mhour and trips.minute =mroute.mminute and trips.week_day=1
inner join routes on routes.cod_route =trips.cod_route
inner join points_routes on points_routes.cod_route =routes.cod_route
inner join points on points.cod_point =points_routes.cod_point and points.name_point='sokol'
inner join buses on buses.cod_bus =trips.cod_bus
inner join models on models.cod_model =buses.cod_model
P.S. это было пропущено
какое отношение к Error: ORA-00907 не знаю. Никогда не работал с Oracle.
P.P.S. неверное указание имени. надо убрать {s}
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 08.06.2016 в 09:21.
evg_m вне форума Ответить с цитированием
Старый 07.06.2016, 20:59   #4
Tormozz
 
Регистрация: 06.06.2016
Сообщений: 3
По умолчанию

Очень благодарю за решение, но система почему-то говорит: "Error: ORA-00907: отсутствует правая скобка"

Последний раз редактировалось Tormozz; 07.06.2016 в 21:53.
Tormozz вне форума Ответить с цитированием
Старый 08.06.2016, 14:06   #5
Tormozz
 
Регистрация: 06.06.2016
Сообщений: 3
По умолчанию

В общем, спасибо за помощь А под Oracle у меня получилось написать рабочий запрос такой:
Код:
select hour, minute, name_route, (places-tickets) from models inner join buses on
models.cod_model=buses.cod_model inner join trips on
buses.cod_bus=trips.cod_bus inner join routes on
trips.cod_route=routes.cod_route inner join points_routes on
routes.cod_route=points_routes.cod_route inner join points on
points_routes.cod_point=points.cod_point where
week_day=1 and (trips.hour*60+trips.minute) in(select min(trips.hour*60+trips.minute) from trips,routes,points_routes,points where
trips.week_day=1 and trips.cod_route=routes.cod_route and routes.cod_route=points_routes.cod_route and points_routes.cod_point=points.cod_point and name_point='Сокол' group by week_day)
and points.name_point='Сокол' order by name_route
Tormozz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с запросом sql sery80 SQL, базы данных 8 18.11.2014 21:29
получение текстовых данных SQL запросом R Dmitry Microsoft Office Excel 3 01.05.2011 01:29
Помогите с SQL-запросом! lordaleksej БД в Delphi 2 03.12.2009 22:55
Помогите с SQL-запросом FleshDro SQL, базы данных 15 28.07.2009 13:32
Помогите с запросом SQL пожалуйста Андрей79 SQL, базы данных 7 05.04.2009 01:08