SQL语句仅选择出现少于两次的项目

时间:2012-03-23 15:43:50

标签: sql oracle oracle-sqldeveloper

我目前正在开发一个数据库,该数据库存储允许用户在餐厅预订的信息。

我正在尝试创建一个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;

上述语句返回不在预订表中的所有时间。但是,我如何返回保留表中出现的所有时间,包括那些出现一次而不是出现两次的那些?

由于

2 个答案:

答案 0 :(得分: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 :(得分:-1)

如果您唯一关心的是返回reservation.a_time一次只显示一次,那么这样就可以了:

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

这会按时间对所有RESERVATION个条目进行分组,并且只返回只有一个成员的组。