4

I have the following database and wish to update the room table. The table room lists a room type that is either single, double or king, the price is the price of each room per night and the name in Hotel is the name of the hotel.

What I need to do is change all double rooms to king rooms which are in the Scotty Hotel and also increase their price by 10%.

I know how to update the price and the type when it is in a single table, but it seems here I need to join hotel and room on HNO and thus update. Nested query maybe?

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)
);

I have two main questions:

  1. Is it possible to do an update to a table, that requires a join?

  2. I want to list guests via a view. Can I create a view which contains the hotel name and number of distinct guests that have ever stayed in the hotel?

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 の場合、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' ;
于 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 に答える