2012-03-23 43 views
0

我目前正在研究一個存儲信息的數據庫,該數據庫允許用戶在餐廳進行預定。SQL語句只選擇出現次數少於兩次的項目

我想創建一個SQL語句,它返回保留表中出現少於兩次的時間。

目前我有這個,但這隻返回沒有出現在保留表中的時間。

SELECT * 
FROM TIME 
WHERE 
    TIME NOT IN (
     SELECT reservation.a_time 
     FROM 
      RESERVATION 
     JOIN TIME ON 
      reservation.a_time = time.time 
     WHERE 
      reservation.a_date = :the_date 
    ) 
ORDER BY time; 

上述語句返回所有不在保留表中的時間。然而,我將如何返回預訂表中出現的所有時間,包括那些出現一次但不是那些出現兩次的時間?

感謝

回答

3
select 
    * 
from 
    TIME t 
where 
    (select 
    count(r.a_time) 
    from 
    RESERVATION r 
    where 
    r.a_time = t.time and 
    r.a_date = :the_date) < 2 

select 
    t.time /* and maybe other field, which you need to add to Group By as well */ 
from 
    TIME t 
    left join RESERVATION r on r.a_time = t.time and r.a_date = :the_date 
group by 
    t.time 
having 
    count(t.time) < 2 

我更喜歡第一個,因爲它是更清潔,更清晰,儘管子查詢,可以擴展更容易。

-1

如果你關心返回了恰好出現一次reservation.a_time是唯一的事情,那麼這將做到這一點:

SELECT reservation.a_time 
FROM RESERVATION 
GROUP BY reservation.a_time 
HAVING COUNT(*) = 1; 

這將組中的所有RESERVATION條目按時間,並且只回報只有一個成員的組。

+0

這不會返回沒有保留的時間。 – GolezTrol 2012-03-23 15:48:24

+0

@GolezTrol然後他的問題措辭很奇怪,因爲他特別要求'出現在保留表中的所有時間'。 – ean5533 2012-03-23 15:49:37