2012-03-18 107 views
2

enter image description hereSQL查询从表中排除某些值

大家好我是在建设机房分配系统来检查,如果一个房间可在给定日期的过程。有大约20个独特的房间ID,我刚刚包括在上面的几个片段。

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

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

我用下面的SQL查询:

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

遗憾的是它不工作,因为虽然它不包括对结果单排,它包含的结果对于一个给定其余ROOM_ID

+0

这通常有利于随身携带,因为你正在使用的特定数据库您的文章每个数据库都支持略有不同的SQL方言。 – 2012-03-18 09:27:22

回答

8

没试过,但在这里不用

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

你可以使用一个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>>) 
3

考虑您已经列名为RoomID我假设有一个房间表与对应ing列RoomID - 这可能是一个更好的地方寻找所有房间,因为你不能保证每个房间都有预订,所以不能单独依靠预订表。

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

select RoomID from Room 
where RoomID not in 
(select RoomID from room_booking 
where date = @date) 
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