如何在查询中仅使用COUNT(*)来查找只有红色小船的日子?

时间:2019-02-03 22:26:38

标签: sql

鉴于下面的以下数据库,我试图找到一种方法,可以从保留表中列出仅使用COUNT()函数保留红船的日子。从表上看,仅应显示星期一和星期日,因为那几天只保留了红船。星期三不应该包括在内,因为当天还保留了一条蓝船。我不确定如何只使用COUNT()来完成此操作。

(水手)
等级评定
布鲁图斯1
安迪8
Horatio 7
生锈的8
鲍勃1

(预订)
sname bname day

安迪·因特拉克星期一
安迪湾星期三
安迪·马林星期六
生锈的海湾周日
生锈的因特拉克星期三
生锈的海军陆战队星期三
鲍勃湾星期一

(船)
bname颜色评级
SpeedQueen白色9
因特拉克红8
海军蓝7
海湾红3

(全天)

星期一
星期二
星期三
星期四
星期五
星期六
星期天

到目前为止,我已经设法提出了以下建议,尽管应该只显示星期一和星期日。

select distinct day
from reservation
where (
select count(*)
from reservation r, boat b
where r.day=reservation.day and
      r.bname=b.bname and
      r.color = 'red')

显示以下内容:
星期一
星期三
星期天

编辑:对表中的间距表示抱歉。我希望这是有道理的。

2 个答案:

答案 0 :(得分:1)

SELECT rcount.day
(
    SELECT day, COUNT(*) AS cnt
    FROM reservations
    GROUP BY day
) rcount
JOIN
(
    SELECT day, COUNT(*) AS cnt
    FROM reservations res JOIN boats b ON res.bname = b.bname
    WHERE b.color = 'red'
    GROUP BY day
) red_res_count
ON rcount.day = red_res_count.day
WHERE red_res_count.cnt = rcount.cnt

这将获取每天的预订总数,并将它们与每天的红色预订数相加。如果红色预订数=当天的总预订量,则说明只有红色预订数。

答案 1 :(得分:0)

这是一种方法:

select r.day
from reservations r join
     boats b
     on r.bname = b.bname
group by r.day
having count(*) = count(case when b.color = 'red' then b.bname end);