2013-04-01 65 views
3

我有以下數據庫,並希望更新room表。表room列出了單人房,雙人房或國王房型,價格是每間房每晚的價格,酒店名稱是酒店的名稱。通過連接的SQL更新表?

我需要做的是將所有的雙人房改爲斯科蒂酒店的特大房,同時價格也提高10%。

我知道如何更新價格和類型,當它在一張桌子,但它似乎在這裏我需要加入酒店和房間的硝酸,從而更新。嵌套查詢可能?

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

什麼[RDBMS](http://en.wikipedia.org/ wiki/Relational_database_management_system)您正在使用? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,並且適用於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等... –

+0

您在上面的代碼中有多個錯誤,這樣我無法快速構建SQL小提琴來幫助你。例如,在'create table Hotel'結尾添加一個右括號'''' – Sepster

+0

@Sepster你看到了什麼錯誤?除了缺少一些DBMS中不需要的';'外,我什麼都看不到。 –

回答

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

希望這能奏效。 這假定酒店名稱斯科蒂是獨一無二的,當然

+3

-1。 HNO是char型(4)。 'Scotty'會適合嗎? – Sepster

+0

HNO抱歉,實際上是酒店的ID號碼,而不是字符'scotty'。所以我的假設是,你將不得不加入酒店名稱'Scotty Hotel'的表格? – user2182032

+0

@Sepster你是對的,修正了代碼 –

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服務器

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' ; 
+0

+1。請注意,更新'UPDATE a JOIN b SET ...'的語法只適用於MySQL。 –

+0

@ypercube好點,謝謝。我已經添加了MSSQL版本,我很感謝您的同行評審/編輯? – Sepster

+0

對我來說很好。 –