我有以下数据库并希望更新room
表。表room
列出了单人,双人或国王的房型,价格是每个房间每晚的价格,酒店的名称是酒店的名称。
我需要做的是将所有双人间改为Scotty酒店的特大号床间,并将价格提高10%。
我知道如何在单个表格中更新价格和类型,但似乎在这里我需要在HNO上加入酒店和房间,然后更新。嵌套查询可能吗?
create table Hotel (
HNo char(4),
Name varchar(20) not null,
Address varchar(50),
Constraint PK_Hotel Primary Key (HNo)
);
create table Room (
RNo char(4),
HNo char(4),
Type char(6) not null,
Price decimal (7,2),
Constraint PK_Room Primary Key (HNo, RNo),
Constraint FK_Room Foreign Key (HNo)
references Hotel (HNo)
);
create table Guest (
GNo char(4),
Name varchar(20) not null,
Address varchar(50),
Constraint PK_Guest Primary Key (GNo)
);
create table Booking (
HNo char(4),
GNo char(4),
DateFrom date,
DateTo date,
RNo char(4),
Constraint PK_Booking Primary Key (HNo, GNo, DateFrom),
Constraint FK_Booking Foreign Key (GNo)
references Guest (GNo),
Constraint FK_Booking_room Foreign Key (HNo, RNo)
references Room (HNo, RNo),
Constraint FK_Booking_hotel Foreign Key (HNo)
references Hotel (HNo)
);
我有两个主要问题:
是否可以对表进行更新,这需要加入?
我想通过视图列出来宾。我可以创建一个视图,其中包含酒店名称和曾经住过酒店的不同客人的数量吗?
答案 0 :(得分:10)
首先,最好选择一个以确保您的搜索/过滤条件正确无误:
SELECT
h.Name,
r.RNo,
r.Type,
r.Price
FROM
room r
INNER JOIN hotel h
on h.hno = r.hno
WHERE
h.name = 'Scotty Hotel'
and
r.type = 'Double' ;
如果这是针对正确的行,那么请使用相同的过滤条件使用更新查询,如下所示。
提示,复制整个SELECT
查询然后对其进行编辑以形成新的UPDATE
查询是值得的。例如,对于mySql,将FROM
替换为UPDATE
(并保留原始FROM
子句的内容以形成新的UPDATE
子句),将WHERE
保留为放置并使用原始查询中SELECT
列表的内容作为构成新SET
子句的基础(紧接在WHERE
子句之前)。
此代码适用于 mySql :
UPDATE room r
INNER JOIN hotel h
on h.hno = r.hno
SET
r.type = 'King',
r.price = r.price * 1.1
WHERE
h.name = 'Scotty Hotel'
and
r.type = 'Double' ;
此代码适用于 MS SQL Server :
UPDATE r
SET
r.type = 'King',
r.price = r.price * 1.1
FROM
room r
INNER JOIN hotel h
on h.hno = r.hno
WHERE
h.name = 'Scotty Hotel'
and
r.type = 'Double' ;
答案 1 :(得分:2)
为什么这不起作用?
UPDATE ROOM A SET TYPE='King', A.PRICE=A.PRICE*1.1
WHERE A.TYPE ='DOUBLE' AND
A.HNO IN (SELECT HNO FROM HOTEL WHERE NAME='Scotty')
希望这有效。 这假设酒店名称Scotty是独一无二的,当然