此脚本检索仅拥有所需客房的酒店。如果酒店仅有一间所需客房,则该酒店将被排除。
更新于2013年1月15日
IF OBJECT_ID('tempdb.dbo.#RoomParams') IS NOT NULL DROP TABLE dbo.#RoomParams
SELECT SUM(rooms) AS rooms, adults
INTO dbo.#RoomParams
FROM (VALUES(1, 2),
(1, 2),
(1, 3))
p(rooms, adults)
GROUP BY adults
;WITH cte AS
(
SELECT h.hotel_id, h.hotel_name, h.location, r.room_type, r.price,
SUM(avail_rooms) OVER (PARTITION BY h.hotel_id, r.max_adults_allowed) AS cnt,
r.max_adults_allowed
FROM CONTRACT c JOIN ROOM r ON c.contract_id = r.contract_id AND c.hotel_id = r.hotel_id
JOIN HOTEL h ON c.hotel_id = h.hotel_id
WHERE c.valid_from >= '20130114' AND c.valid_to <= '20130115'
AND h.location IN ('loc4')
)
SELECT *
FROM cte s
WHERE
NOT EXISTS (
SELECT rp.adults
FROM dbo.#RoomParams rp
EXCEPT
SELECT st.max_adults_allowed
FROM cte st JOIN dbo.#RoomParams r ON st.cnt >= r.rooms AND st.max_adults_allowed = r.adults
WHERE st.hotel_id = s.hotel_id
) AND s.max_adults_allowed IN (SELECT adults FROM dbo.#RoomParams)
演示 SQLFiddle。
如果您想检索至少有一个选项的所有酒店
IF OBJECT_ID('tempdb.dbo.#RoomParams') IS NOT NULL DROP TABLE dbo.#RoomParams
SELECT rooms, adults
INTO dbo.#RoomParams
FROM (VALUES(1, 2),
(1, 2),
(1, 3))
p(rooms, adults)
;WITH cte AS
(
SELECT h.hotel_id, h.hotel_name, h.location, r.room_type, r.price,
SUM(avail_rooms) OVER (PARTITION BY h.hotel_id, r.max_adults_allowed) AS cnt,
r.max_adults_allowed
FROM CONTRACT c JOIN ROOM r ON c.contract_id = r.contract_id AND c.hotel_id = r.hotel_id
JOIN HOTEL h ON c.hotel_id = h.hotel_id
WHERE c.valid_from >= '20130114' AND c.valid_to <= '20130115'
AND h.location IN ('loc4')
)
SELECT hotel_name, location, room_type, price, max_adults_allowed, cnt
FROM cte c
WHERE EXISTS (
SELECT 1
FROM dbo.#RoomParams r
WHERE c.cnt >= r.rooms AND c.max_adults_allowed = r.adults
)