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