2012-03-23 243 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