一个表
CREATE TABLE room_status (
sid INTEGER GENERATED BY DEFAULT AS IDENTITY(start with 160,increment by 1) ,
rid INTEGER,
cid INTEGER,
check_in VARCHAR(20) NOT NULL,
check_out VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL,
CONSTRAINT room_status PRIMARY KEY (sid),
CONSTRAINT fk_room FOREIGN KEY (rid) REFERENCES room_info (rid),
CONSTRAINT fk_customer FOREIGN KEY (cid) REFERENCES customer_info (cid),
CONSTRAINT status_constraint CHECK (status IN ('booked', 'occupied'))
);
插入的元素
Room Number Customer ID Customer Name Check In Date Check Out Date Operation
105 101 Helen Paik 2010-05-10 2010-05-12 CheckIn
108 101 Helen Paik 2010-05-10 2010-05-12 CheckIn
109 101 Helen Paik 2010-05-10 2010-05-12 CheckIn
301 103 Kay Wood 2010-05-29 2010-06-16 CheckIn
1702 104 Rud Jin 2010-05-18 2010-05-30 CheckIn
109 110 Helen Zong 2010-05-13 2010-05-24 CheckIn 当我要 选择 房间 要求是 2010-05-10 2010-05-12 之间 可以入住的 得到的结果 还是有最下面的那个109, 求助sql 要怎么写 才能 避免这个 错误
CREATE TABLE room_status (
sid INTEGER GENERATED BY DEFAULT AS IDENTITY(start with 160,increment by 1) ,
rid INTEGER,
cid INTEGER,
check_in VARCHAR(20) NOT NULL,
check_out VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL,
CONSTRAINT room_status PRIMARY KEY (sid),
CONSTRAINT fk_room FOREIGN KEY (rid) REFERENCES room_info (rid),
CONSTRAINT fk_customer FOREIGN KEY (cid) REFERENCES customer_info (cid),
CONSTRAINT status_constraint CHECK (status IN ('booked', 'occupied'))
);
插入的元素
Room Number Customer ID Customer Name Check In Date Check Out Date Operation
105 101 Helen Paik 2010-05-10 2010-05-12 CheckIn
108 101 Helen Paik 2010-05-10 2010-05-12 CheckIn
109 101 Helen Paik 2010-05-10 2010-05-12 CheckIn
301 103 Kay Wood 2010-05-29 2010-06-16 CheckIn
1702 104 Rud Jin 2010-05-18 2010-05-30 CheckIn
109 110 Helen Zong 2010-05-13 2010-05-24 CheckIn 当我要 选择 房间 要求是 2010-05-10 2010-05-12 之间 可以入住的 得到的结果 还是有最下面的那个109, 求助sql 要怎么写 才能 避免这个 错误
另外room_status這個表CREATE有問題
CONSTRAINT room_status PRIMARY KEY (sid)這一句去掉CONSTRAINT room_status
變成
CREATE TABLE room_status (
sid INTEGER GENERATED BY DEFAULT AS IDENTITY(start with 160,increment by 1) ,
rid INTEGER,
cid INTEGER,
check_in VARCHAR(20) NOT NULL,
check_out VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL,
PRIMARY KEY (sid),
CONSTRAINT fk_room FOREIGN KEY (rid) REFERENCES room_info (rid),
CONSTRAINT fk_customer FOREIGN KEY (cid) REFERENCES customer_info (cid),
CONSTRAINT status_constraint CHECK (status IN ('booked', 'occupied'))
);
最好貼出room_info,customer_info的CREATE語句,不然沒法本地模擬你的環境
cid INTEGER GENERATED BY DEFAULT AS IDENTITY(start with 110,increment by 1) ,
firstname VARCHAR(20) NOT NULL,
lastname VARCHAR(20),
passport_num VARCHAR(20) NOT NULL,
email VARCHAR(30) NOT NULL,
credit_num VARCHAR(18) NOT NULL,
phone_num VARCHAR(10),
address VARCHAR(50),
CONSTRAINT customer_info PRIMARY KEY (cid),
CONSTRAINT cid_constraint CHECK (cid > 0)
);
CREATE TABLE room_info (
rid INTEGER,
room_type VARCHAR(20) NOT NULL,
price INTEGER NOT NULL,
CONSTRAINT room_info PRIMARY KEY (rid),
CONSTRAINT type_constraint CHECK (room_type IN
('Single Room', 'Twin Bed', 'Queen', 'Executive', 'Suite')),
CONSTRAINT price_constraint CHECK (price > 100 AND price <= 10000),
CONSTRAINT room_num_constraint CHECK (rid >= 100 AND rid <= 1900)
);
CREATE TABLE room_status (
sid INTEGER GENERATED BY DEFAULT AS IDENTITY(start with 160,increment by 1) ,
rid INTEGER,
cid INTEGER,
check_in VARCHAR(20) NOT NULL,
check_out VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL,
CONSTRAINT room_status PRIMARY KEY (sid),
CONSTRAINT fk_room FOREIGN KEY (rid) REFERENCES room_info (rid),
CONSTRAINT fk_customer FOREIGN KEY (cid) REFERENCES customer_info (cid),
CONSTRAINT status_constraint CHECK (status IN ('booked', 'occupied'))
);
这个字段对应你表 room_status 中的什么字段? 当然我可以猜,但猜错了反而浪费双方时间。 (不要高估你的汉语表达能力或者我的汉语理解能力)
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
cid INTEGER GENERATED BY DEFAULT AS IDENTITY(start with 110,increment by 1) ,
firstname VARCHAR(20) NOT NULL,
lastname VARCHAR(20),
passport_num VARCHAR(20) NOT NULL,
email VARCHAR(30) NOT NULL,
credit_num VARCHAR(18) NOT NULL,
phone_num VARCHAR(10),
address VARCHAR(50),
CONSTRAINT customer_info PRIMARY KEY (cid),
CONSTRAINT cid_constraint CHECK (cid > 0)
);
CREATE TABLE room_info (
rid INTEGER,
room_type VARCHAR(20) NOT NULL,
price INTEGER NOT NULL,
CONSTRAINT room_info PRIMARY KEY (rid),
CONSTRAINT type_constraint CHECK (room_type IN
('Single Room', 'Twin Bed', 'Queen', 'Executive', 'Suite')),
CONSTRAINT price_constraint CHECK (price > 100 AND price <= 10000),
CONSTRAINT room_num_constraint CHECK (rid >= 100 AND rid <= 1900)
);
CREATE TABLE room_status (
sid INTEGER GENERATED BY DEFAULT AS IDENTITY(start with 160,increment by 1) ,
rid INTEGER,
cid INTEGER,
check_in VARCHAR(20) NOT NULL,
check_out VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL,
CONSTRAINT room_status PRIMARY KEY (sid),
CONSTRAINT fk_room FOREIGN KEY (rid) REFERENCES room_info (rid),
CONSTRAINT fk_customer FOREIGN KEY (cid) REFERENCES customer_info (cid),
CONSTRAINT status_constraint CHECK (status IN ('booked', 'occupied'))
);2 我的insert 语句
DELETE FROM room_info;
DELETE FROM customer_info;
DELETE FROM room_status;
insert into customer_info values (101, 'Helen', 'Paik', 'S32123', '[email protected]', '09234581920348', '0387293476','sad st');
insert into customer_info values (102, 'Jacky', 'Chen', 'HJ87212', '[email protected]', '9812038487183', '0342445432','happe st');
insert into customer_info values (103, 'Kay', 'Wood', 'WD87342', '[email protected]', '18938183983912', '032345433','happe st');
insert into customer_info values (104, 'Rud', 'Jin', 'LK87192', '[email protected]', '23233432434', '04324534535','happe st');
insert into customer_info values (105, 'Lam', 'Jun', 'LP29302', '[email protected]', '29819328191212', '2901993223','happe st');
insert into room_info values (101, 'Single Room', '300');
insert into room_info values (102, 'Single Room', '300');
insert into room_info values (103, 'Single Room', '300');
insert into room_info values (104, 'Single Room', '300');
insert into room_info values (105, 'Single Room', '300');
insert into room_info values (106, 'Single Room', '300');
insert into room_info values (107, 'Single Room', '300');
insert into room_info values (108, 'Single Room', '300');
insert into room_info values (109, 'Single Room', '300');
insert into room_info values (110, 'Single Room', '300');
insert into room_info values (501, 'Single Room', '300');
insert into room_info values (502, 'Single Room', '300');
insert into room_info values (503, 'Single Room', '300');
insert into room_info values (504, 'Single Room', '300');
insert into room_info values (505, 'Single Room', '300');
insert into room_info values (506, 'Single Room', '300');
insert into room_info values (507, 'Single Room', '300');
insert into room_info values (508, 'Single Room', '300');
insert into room_info values (509, 'Single Room', '300');
insert into room_info values (510, 'Single Room', '300');
insert into room_info values (201, 'Twin Bed', '500');
insert into room_info values (202, 'Twin Bed', '500');
insert into room_info values (203, 'Twin Bed', '500');
insert into room_info values (204, 'Twin Bed', '500');
insert into room_info values (205, 'Twin Bed', '500');
insert into room_info values (206, 'Twin Bed', '500');
insert into room_info values (207, 'Twin Bed', '500');
insert into room_info values (208, 'Twin Bed', '500');
insert into room_info values (209, 'Twin Bed', '500');
insert into room_info values (210, 'Twin Bed', '500');
insert into room_info values (301, 'Queen', '700');
insert into room_info values (302, 'Queen', '700');
insert into room_info values (303, 'Queen', '700');
insert into room_info values (304, 'Queen', '700');
insert into room_info values (305, 'Queen', '700');
insert into room_info values (306, 'Queen', '700');
insert into room_info values (307, 'Queen', '700');
insert into room_info values (308, 'Queen', '700');
insert into room_info values (309, 'Queen', '700');
insert into room_info values (310, 'Queen', '700');
insert into room_info values (401, 'Executive', '1400');
insert into room_info values (402, 'Executive', '1400');
insert into room_info values (403, 'Executive', '1400');
insert into room_info values (404, 'Executive', '1400');
insert into room_info values (405, 'Executive', '1400');
insert into room_info values (406, 'Executive', '1400');
insert into room_info values (1801, 'Suite', '3200');
insert into room_info values (1802, 'Suite', '3200');
insert into room_info values (1701, 'Suite', '3200');
insert into room_info values (1702, 'Suite', '3200');insert into room_status values (151, 105, 101, '2010-05-10', '2010-05-12', 'booked');
insert into room_status values (152, 108, 101, '2010-05-10', '2010-05-12', 'booked');
insert into room_status values (153, 109, 101, '2010-05-10', '2010-05-12', 'booked');
insert into room_status values (154, 210, 102, '2010-04-29', '2010-06-30', 'occupied');
insert into room_status values (155, 301, 103, '2010-05-29', '2010-06-16', 'booked');
insert into room_status values (156, 1702, 104, '2010-05-18', '2010-05-30', 'booked');
insert into room_status values (157, 406, 105, '2010-04-27', '2010-05-24', 'occupied');
2.2 插入一条insert into room_status ( rid , cid ,check_in ,check_out , status )values (109, 110, '2010-05-13', '2010-05-24', 'booked')
3 select 语句
3.1
select *
from room_status;结果
151 105 101 2010-05-10 2010-05-12 booked
152 108 101 2010-05-10 2010-05-12 booked
153 109 101 2010-05-10 2010-05-12 booked
154 210 102 2010-04-29 2010-06-30 occupied
155 301 103 2010-05-29 2010-06-16 booked
156 1702 104 2010-05-18 2010-05-30 booked
157 406 105 2010-04-27 2010-05-24 occupied
160 109 110 2010-05-13 2010-05-24 booked
3.2
select DISTINCT R.rid
from room_info AS R, room_status AS RS
where ((RS.rid = R.rid AND (RS.check_in > '2010-05-12' OR RS.check_out < '2010-05-10'))
OR R.rid NOT IN (select RSS.rid from room_status AS RSS)) AND R.room_type ='Single Room'
group by R.rid;
得到结果 101
102
103
104
106
107
109
110
501
502
503
504
505
506
507
508
509
510问题 如何 修改 第二段 语句 使得 109 这个id 不会 选上
本人用的是 hsql 和 mysql 类似的一个小型 数据库
但是 在下一个数据中160 109 110 2010-05-13 2010-05-24 booked这个又是符合了我的条件所以 109 又被选上了,
请教 各位 我要怎么避免这个 错误了?
求助