Oracle:簡單分析火車票餘票查詢和座位剩餘
阿新 • • 發佈:2018-11-01
引用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