您的位置:首页 > 数据库 > Oracle

Oracle:简单分析火车票余票查询和座位剩余

2017-11-09 16:21 806 查看
引用CSDN论坛上的一个问题,http://bbs.csdn.net/topics/392284590 ,开始思路错误,给了一个错误的答案,然后仔细分析了一下

题目如下:

假设有一个车次1经过5个站,站点1,站点2,站点3,站点4,站点5(另外有一个车次2,经过站点3,站点4,站点6)

有3个座位,座位1,座位2,座位3

有乘客,买了车次1 站点1到站点3的座位1,站点4到站点5的座位1,

站点2到站点4的座位2,站点1到站点2的座位3,站点3到站点5的座位3,

自己确定数据库表的结构

问:怎么查到站点3到站点4的车次信息,它的余票,哪个座位有余票

思路:创建三张表,分别如下

--座位信息表
drop table train_seat;
create table train_seat(
num varchar(6), --车次
seat_num varchar(10),--座位号
primary key(num,seat_num)
);
--站点信息表
drop table train_site;
create table train_site(
num varchar(6), --车次
site varchar(10),--站点
primary key(num,site)
);
----创建序列
create sequence train_order_seq
increment by 1
start with 1
maxvalue 10000
nominvalue
nocache
--订票信息表
drop table train_order;
create table train_order(
id int,
num varchar(6), --车次
site_start varchar(10),--起始站点
site_end varchar(10),--截止站点
isOrder int,--是否预定:0-否,1-是
seat_num varchar(10),--座位号
order_people varchar(10),--预定人
primary key(id)
);


插入数据:

INSERT INTO TRAIN_ORDER (ID, NUM, SITE_START, SITE_END, ISORDER, SEAT_NUM, ORDER_PEOPLE) VALUES (train_order_seq.nextval, '车次1', '1', '3', 1, '1', 'A');
INSERT INTO TRAIN_ORDER (ID, NUM, SITE_START, SITE_END, ISORDER, SEAT_NUM, ORDER_PEOPLE) VALUES (train_order_seq.nextval, '车次1', '4', '5', 1, '1', 'B');
INSERT INTO TRAIN_ORDER (ID, NUM, SITE_START, SITE_END, ISORDER, SEAT_NUM, ORDER_PEOPLE) VALUES (train_order_seq.nextval, '车次1', '2', '4', 1, '2', 'C');
INSERT INTO TRAIN_ORDER (ID, NUM, SITE_START, SITE_END, ISORDER, SEAT_NUM, ORDER_PEOPLE) VALUES (train_order_seq.nextval, '车次1', '1', '2', 1, '3', 'D');
INSERT INTO TRAIN_ORDER (ID, NUM, SITE_START, SITE_END, ISORDER, SEAT_NUM, ORDER_PEOPLE) VALUES (train_order_seq.nextval, '车次1', '3', '5', 1, '3', 'E');

INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次1', '1');
INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次1', '2');
INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次1', '3');
INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次1', '4');
INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次1', '5');
INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次2', '3');
INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次2', '4');
INSERT INTO TRAIN_SITE (NUM, SITE) VALUES ('车次2', '6');
INSERT INTO TRAIN_SEAT (NUM, SEAT_NUM) VALUES ('车次1', '1');
INSERT INTO TRAIN_SEAT (NUM, SEAT_NUM) VALUES ('车次1', '2');
INSERT INTO TRAIN_SEAT (NUM, SEAT_NUM) VALUES ('车次1', '3');
INSERT INTO TRAIN_SEAT (NUM, SEAT_NUM) VALUES ('车次2', '1');
INSERT INTO TRAIN_SEAT (NUM, SEAT_NUM) VALUES ('车次2', '2');
INSERT INTO TRAIN_SEAT (NUM, SEAT_NUM) VALUES ('车次2', '3');
查询余票及剩余座位信息:

--查询哪个座位有余票
select A.num,A.seat_num from(
select s1.num,s1.seat_num,o1.id from train_seat s1 left join train_order o1 on s1.num = o1.num and s1.seat_num = o1.seat_num and o1.site_start <=3 and o1.site_end >=4) A
where A.id is null order by A.num
--查询余票数
select A.num,count(*) 余票 from(
select s1.num,s1.seat_num,o1.id from train_seat s1 left join train_order o1 on s1.num = o1.num and s1.seat_num = o1.seat_num and o1.site_start <=3 and o1.site_end >=4) A
where A.id is null group by A.num
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息