SQL更新表通过加入?

时间:2013-04-01 12:10:03

标签: sql views

我有以下数据库并希望更新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)
);

我有两个主要问题:

  1. 是否可以对表进行更新,这需要加入?

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

2 个答案:

答案 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是独一无二的,当然