SQL查询从表中排除某些值

时间:2012-03-18 09:19:44

标签: sql

enter image description here

大家好我正在建立一个房间分配系统,检查某个房间是否在某个特定日期可用。有大约20个独特的房间ID,我只是作为几个以上的片段包括在内。

因此,例如,如果用户输入2012-01-01的日期,我希望将 room_id 1排除在结果之外,因为如上所示,它已经被预订了日期。

在某种意义上,在用户的输入日期之间找到的任何匹配都应该导致从列表中排除整个相应room_id的列表。

我使用了以下SQL查询:

SELECT DISTINCT room_id
FROM room_booking
WHERE date_booked<>'$date'

不幸的是它不起作用,因为虽然它排除了单行的结果,但它包含给定 room_id 的其余结果?

4 个答案:

答案 0 :(得分:12)

您可以使用NOT EXISTS

SELECT DISTINCT room_id
  FROM room_booking rb1
 WHERE NOT EXISTS( SELECT 1
                     FROM room_booking rb2
                    WHERE rb2.date_booked = <<date>>
                      AND rb2.room_id     = rb1.room_id )

NOT IN

SELECT DISTINCT room_id
  FROM room_booking
 WHERE room_id NOT IN (SELECT room_id
                         FROM room_booking rb2
                        WHERE rb2.date_booked = <<date>>)

答案 1 :(得分:10)

没试过这个,但是这里去了

SELECT DISTINCT room_id
FROM room_booking
WHERE room_id NOT IN 
    (SELECT DISTINCT room_id
     FROM room_booking
     WHERE date_booked = '$date'
    )

答案 2 :(得分:3)

考虑到你有一个名为RoomID的列我会假设有一个Room表,其中有一个相应的列RoomID - 这可能是一个更好的地方来查找所有房间,因为你无法保证每个房间都有预订,所以不能单独依靠预订表。

然后你可以查询一个子查询,在一个日期预订哪些房间,然后返回不在该列表中的所有RoomIds。

select RoomID from Room
where RoomID not in
(select RoomID from room_booking
where date = @date)

答案 3 :(得分:2)

如果添加了很多房间,上述应该可行,但可能会变慢。您可能需要考虑左外连接。它通常会更快,因为上面将执行子查询,即对于每个房间,重新查询数据库以检查它是否具有此日期的值,这导致每次执行此查询时进行40 * 40次检查,并且将随着数量增加目前的预订。

以下应该更有效, 应该在很多数据库平台上有效。当然,这取决于如果要考虑与字符串性能相关的项目,值的计数可能会改变多少......

SELECT DISTINCT room_id
           FROM room_booking rb1
LEFT OUTER JOIN room_booking datecheck
             ON rb1.room_id = datecheck.room_id
            AND datecheck.date_booked  =  @date
          WHERE datecheck.room_id is null