4

我有以下数据库并希望更新room表。表格room列出了单人房、双人房或特大床房型,价格为每间客房每晚的价格,酒店中的名称为酒店名称。

我需要做的是把所有双人房改成在斯科蒂酒店的特大号床房,而且价格也提高了 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)
);

我有两个主要问题:

  1. 是否可以对需要连接的表进行更新?

  2. 我想通过视图列出来宾。我可以创建一个包含酒店名称和曾入住酒店的不同客人数量的视图吗?

4

2 回答 2

11

首先,最好进行选择以确保您的搜索/过滤条件正确:

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,替换FROMUPDATE(并保留原始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' ;
于 2013-04-01T12:48:41.023 回答
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 是唯一的

于 2013-04-01T12:15:49.920 回答