TSQL查询帮助加入功能

时间:2011-04-10 08:39:25

标签: sql-server tsql

我创建了一个简单的查询,试图找出特定天数内的别墅是免费的(checkin_date和checkout_date)。

但是现在我想到了我不认为我的下面的查询会返回正确的结果:

SELECT DISTINCT default_villa_type  
FROM villa, reservation  
WHERE villa.villa_type = reservation.default_villa_type  
and res_checkin_date not between '2011-12-21' and '2011-12-23'
and res_checkout_date not between '2011-12-21' and '2011-12-23'

我需要使用查询:

别墅表格包含以下栏目:

(villa_id, phone_ext, villa_type, no_of_rooms, no_of_beds, default_price_plan)

包含以下列的预订表:

(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, default_villa_type, price_plan)

我不相信它正确地使用两个表来确定哪些类型的别墅在查询中的日期仍然可用,但我可能错了我需要一双新眼睛来看看它。

1 个答案:

答案 0 :(得分:2)

您可以尝试找到所有不首先免费的别墅,因为您没有代表免费别墅的记录,而只是代表不是免费别墅的记录。

SELECT  villa_id
FROM    villa
WHERE   villa_type NOT IN (
    SELECT  default_villa_type
    FROM    reservation
            --reservations starting within range
    WHERE   res_checkin_date > '2011-12-21'
            AND res_checkin_date < '2011-12-23'

            --reservations starting before range and ending after range
            OR (
                res_checkin_date <= '2011-12-21'
                AND res_checkout_date > '2011-12-21'
            )

            --reservations ending within range
            OR (
                res_checkout_date > '2011-12-21'
                AND res_checkout_date < '2011-12-23'
            )
)

另一种方式,根据Mikael的评论,可以是:

SELECT  villa_id
FROM    villa
WHERE   villa_type NOT IN (
    SELECT default_villa_type
    FROM   reservation
    WHERE  res_checkin_date < '2011-12-23'
           AND res_checkout_date > '2011-12-21'
)

我还建议您使用变量而不是静态字符串日期。