2009-11-29 90 views
-1

我有3個表(注意,這可能不是最好的SQL數據庫設計)SQL查詢表之間的3

Room: TypeName, RoomNumber 
RoomType: TypeName, ... 
Reservation: StartDate, EndDate, TypeName, RoomNumber 

我的輸入參數爲startdateenddate。我想知道可用的不同roomtypes。從我的理解的解決方案是這樣的:AvailableRoomTypes = AllRoomTypes - UnavailableRoomTypes

顯然AllRoomTypes可以發現:SELECT DISTINCT(TypeName) FROM Room; ,我知道怎麼去不可的房間,但不是不可用roomtypes。我也不知道如何從另一套中減去一套。我可以得到一組所有rooms+roomtypes和另一組不可用rooms+roomtypes,但我如何加入它們使得它是A-B?也許某種函數?

我想我的輸出參數是SELECT * FROM RoomType (for the appropriate roomtypes)

+0

什麼數據庫,你可以更明顯什麼是表和它的列是什麼? –

+0

這是我有: SELECT r.roomtype,s.servicename 從預訂[R JOIN BILLING B關於b.reservationid = r.reservationid 和b.paid = 1 JOIN Customer_SERVICE S於s.customerserviceid = b.customerserviceid ; 我需要爲每個不同的reservation.roomtype和customer_service.servicename計算billing.total。所以我想要: 選擇SUM(b.total)作爲保留... 加入 爲服務選擇SUM(b.total)... ? – Stuart

回答

0

未使用RoomTypes

做AB選擇
select RT.* 
from RoomType RT 
where RT.TypeName not in (
    Select RM.TypeName 
    from Room RM 
) 

一種方法是 「沒有(選擇..)」 操作,不存在(選擇..)是另一個將會有更多的,我我確定。

+0

也可以使用差異聯盟 –

+0

@Russ Cam:我不知道'差異聯盟'聯盟是什麼(谷歌表示它也不是)!你是否願意發表一個解答OP的問題來證明「差異聯盟」?但是你的觀點已經被採納,我的回答聽起來似乎是絕對的,好像'不是'是解決OP問題的唯一方法。會改變! – lexu

+0

差異工會TSQL: 選擇等等等等 EXCEPT 選擇等等等等 – Hogan

1
SELECT t.* 
    FROM ROOMTYPE t 
WHERE NOT EXISTS(SELECT NULL 
        FROM RESERVATION r 
        JOIN ROOM ro ON ro.roomnumber = r.roomnumber 
        WHERE ro.typename = t.typename 
        AND r.startdate BETWEEN ?IN_START_DATE AND ?IN_END_DATE 
        AND r.enddate BETWEEN ?IN_START_DATE AND ?IN_END_DATE) 
0

客房:類型名,RoomNumber RoomType:類型名,...預約:開始日期,結束日期,類型名,RoomNumber

這可能是你的答案...
選擇rt.typename
從房屋R, roomtype室溫,保留重
其中r.typename = rt.typename
和rt.typename = re.typename
其中re.startdate =:START_DATE
和re.enddate =:endate

0

你不想使用UNION - SUM(reservation.roomtype)SUM(service.servicetype)是不同的屬性。但是,如果你這樣做了,你會希望使用NULL來彌補查詢,所以列不重疊。 IE:

SELECT SUM(reservation.roomtype), NULL ... 
UNION ALL 
SELECT NULL, SUM(service.servicetype) ... 

根據您提供的邏輯,這是我想出了查詢:

SELECT SUM(r.roomtype), 
     SUM(s.servicetype) 
    FROM RESERVATION r 
    JOIN BILL b ON b.reservationid = r.reservationid 
      AND b.paid = 1 
    JOIN SERVICE s ON s.serviceid = b.serviceid 

這將返回一行。爲了返回更有意義的結果集,我們需要知道查詢(或查詢取決於信息)的組。 RESERVATIONSERVICE表格的詳細信息將有助於我們爲您提供幫助。