2012-03-18 108 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