SQL语句的问题

SQL语句的问题,sql,if-statement,Sql,If Statement,我有一个火车公司的数据库。我想将两个查询组合在一起,以便可以从Java前端将它们作为一个查询使用 第一个查询返回未满列车的ID select TrainID from Train where Capacity > 0; 每列火车的载客量是50,我每次预订一个座位就减去一个,所以如果载客量大于零,那么车上就有一个座位 第二个查询返回给定目的地和起点的列车的RouteID: select * from Timetable where RouteID = (select R

我有一个火车公司的数据库。我想将两个查询组合在一起,以便可以从Java前端将它们作为一个查询使用

第一个查询返回未满列车的ID

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 |                |
+-------------+-------------+------+-----+---------------------+----------------+
训练


假设时间表表中有一个trainid,则该值应接近

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"
     );

假设时间表表中有一个trainid,则该值应接近

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"
     );

您尚未说明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

您没有说明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;
问候,,
克里斯

稍微猜猜你的模式:

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

连接到路由而不是使用子查询可能会执行得更好。

稍微猜测一下您的模式:

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
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

连接到Routes而不是使用子查询可能会执行得更好。

我假设TrainID存储在Routes表中,这在问题中并不清楚

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
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;
);

我将假设TrainID存储在Routes表中,这在问题中并不清楚

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;
);


你能提供火车表和时刻表的模式吗?我想我们需要知道这两个表的模式。我不确定哪些字段在哪些表中……火车表与时刻表和路线表的关系如何?是否有外键或链接表来实现多:多关系?我们需要更多的架构信息才能对此提供帮助。请编辑文章以包含架构。只是建议您使用联接而不是子查询。它几乎总是表现出色。此外,如果您将门票销售记录保存在数据库中,那么按照您的方式跟踪容量可能是个坏主意。列车的载客量应保持不变(列车不会变小)。计算查询中剩余的座位。这是标准的规范化(不要在DB中保留两次相同的信息-或者可以计算的信息)您可以提供火车和时刻表的模式吗?我认为我们需要知道这两个表的模式。我不确定哪些字段在哪些表中……火车表与时刻表和路线表的关系如何?是否有外键或链接表来实现多:多关系?我们需要更多的架构信息才能对此提供帮助。请编辑文章以包含架构。只是建议您使用联接而不是子查询。它几乎总是表现出色。此外,如果您将门票销售记录保存在数据库中,那么按照您的方式跟踪容量可能是个坏主意。列车的载客量应保持不变(列车不会变小)。计算查询中剩余的座位。这是标准的规范化(不要在数据库中保留两次相同的信息-或可以计算的信息),在这个查询中,您关心列车通行能力。在这个查询中,您关心列车通行能力。不是我,但我可以给您两个可能的原因:(1)格式化,和(2)加入标量值(应该在
的哪里
)。谢谢-有人能告诉我为什么你认为格式化有什么意义吗-如果你是一名程序员-我们不是每天都要处理糟糕的需求和糟糕的决策吗-为什么我们关心它完成工作后的样子!(无需评论,只需大声嚷嚷)另一个批评是你使用了SELECT*。OP说他不是DB的人,所以如果他要学习,请正确地教他。但我没有记下这一点。:)不是我,但我可以给你两个可能的原因:(1)格式化,和(2)加入标量值(应该在
位置)谢谢-有人能告诉我为什么你认为格式化有什么意义吗-如果你是一名程序员-我们不是每天都要处理糟糕的需求和糟糕的决策吗-我们为什么要关心它是否完成了任务!(无需评论,只需咆哮)另一个批评是你使用了SELECT*。OP说他不是DB的人,所以如果他要学习,就要正确地教他。但我没有记下这一点