Проблема с SQL-инструкцией - PullRequest
0 голосов
/ 05 января 2010

У меня есть база данных для железнодорожной компании. Я хочу объединить два запроса вместе, чтобы я мог использовать их как один из внешнего интерфейса Java.

Первый запрос возвращает идентификаторы не заполненных поездов.

select TrainID 
  from Train 
 where Capacity > 0;

Вместимость каждого поезда 50, и я вычитаю по одному при каждом заказе места, поэтому, если вместимость больше нуля, на борту есть место.

Второй запрос возвращает RouteID поезда с указанием пункта назначения и отправления:

select * 
  from Timetable 
 where RouteID = (select RouteID 
                    from Routes 
                   where OriginID = "New York" 
                     and DestinationID = "LA");

Вопрос / Нужда

Я хочу объединить эти два запроса, чтобы получить что-то вроде:

Give me all the Timetable entries for this route ONLY IF there's room on the train.

Я не парень вроде DB, поэтому у меня просто не получается соединить два и два.

Редактировать: схема обрисована в общих чертах ниже. Спасибо за ответы, я собираюсь попробовать их сейчас.

Маршруты

+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| RouteID       | varchar(25) | NO   | PRI | NULL    |       |
| OriginID      | varchar(25) | NO   | MUL | NULL    |       |
| DestinationID | varchar(25) | NO   | MUL | NULL    |       |
| Duration      | int(3)      | NO   |     | NULL    |       |
+---------------+-------------+------+-----+---------+-------+

Станции

+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| StationID | varchar(25) | NO   |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

Расписание

+-------------+-------------+------+-----+---------------------+----------------+
| Field       | Type        | Null | Key | Default             | Extra          |
+-------------+-------------+------+-----+---------------------+----------------+
| TimeID      | int(11)     | NO   | PRI | NULL                | auto_increment |
| RouteID     | varchar(11) | NO   |     | NULL                |                |
| TrainID     | varchar(11) | NO   |     | NULL                |                |
| DepartDate  | timestamp   | NO   |     | 0000-00-00 00:00:00 |                |
| ArrivalDate | timestamp   | NO   |     | 0000-00-00 00:00:00 |                |
+-------------+-------------+------+-----+---------------------+----------------+

Поезд

]+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| TrainID  | varchar(11) | NO   | PRI | NULL    |       |
| Capacity | int(11)     | NO   |     | 50      |       |
+----------+-------------+------+-----+---------+-------+

Ответы [ 5 ]

3 голосов
/ 05 января 2010
Select * from Timetable ti 
inner join Train tr 
    ON ti.TrainID = tr.ID 
    (Or whatever link there is between the two tables)
WHERE ti.RouteID in 
    (select RouteID from Routes where OriginID="New York" 
    and DestinationID="LA") 
AND tr.Capacity > 0
1 голос
/ 05 января 2010

Вы не указали, как TrainID относится к маршруту или расписанию. Для выполнения этой задачи должны быть какие-то отношения.

Если это стандартное отношение, то ...

select t.* 
from Timetable t, Routes r, Trains tr
where r.OriginID ='New York' 
and r.DestinationID ="LA"
and t.RouteID = r.RouteID
and tr.RouteID = t.RouteID
amd tr.Capacity > 0;

С уважением, Chris

0 голосов
/ 05 января 2010

Я собираюсь предположить, что TrainID хранится в таблице маршрутов, это не ясно в вопросе.

select * from Timetable where RouteID in 
(select RouteID from Routes 
 inner join Train on Train.TrainID = Routes.TrainID
where 
  OriginID = "New York" 
  and DestinationID = "LA"
  and Capacity > 0;
);
0 голосов
/ 05 января 2010

Слегка догадываюсь о вашей схеме:

SELECT  t.*
FROM    Timetable t
        INNER JOIN
                Routes r
                ON t.RouteID = r.RouteID
        INNER JOIN
                Trains tr
                ON t.TrainID = tr.TrainID
WHERE   r.OriginID = 'New York'
AND     r.DestinationID = 'LA'
AND     tr.Capacity > 0

Присоединение к маршрутам, а не использование подзапроса может работать лучше.

0 голосов
/ 05 января 2010

Предполагая, что в таблице расписаний есть поезд, он должен быть близок

select a.*
from Timetable a
inner join Train b on a.trainid = b.trainid and b.capacity > 0
where a.RouteID =
     (
     select RouteID
     from Routes
     where OriginID = "New York" and DestinationID="LA"
     );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...