1. 程式人生 > >Oracle:簡單分析火車票餘票查詢和座位剩餘

Oracle:簡單分析火車票餘票查詢和座位剩餘

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