【发布时间】:2014-12-29 02:55:55
【问题描述】:
我有三张桌子:
-
sailor(姓名、评分); -
boat(名称、颜色、评级); -
reservation(sname、bname、工作日、开始、结束);
为了得到预订每艘红船的水手名单,我有:
select s.sname from sailor s
where not exists(
select * from boat b
where b.color = 'red'
and not exists (
select * from reservation r
where r.bname = b.bname
and r.sname = s.sname));
我现在需要用 NOT IN 而不是 NOT EXISTS 重写这个查询。到目前为止,这是我所拥有的:
select s.sname from sailor s
where s.sname not in (select s2.sname from sailor s2 where
s2.sname not in (select r.sname from reservation r where r.bname not in (
select b.bname from boat b where b.color <> 'red' )));
然而,这会返回所有预订红船的水手的列表(不一定是全部)。我很难检查列表中的名称是否保留了每艘船(我也不能使用 COUNT())。
感谢任何帮助
【问题讨论】:
-
您是否遇到任何错误?
-
没有 SQL 错误,但是当我使用 NOT IN 运行第二个查询时,我得到了每个租用红色船的水手的列表,这与每个租用每条船的水手不同。对于这个问题,我很难把注意力集中在 NOT IN 逻辑上。
-
如果你想找到租了所有船的水手,那么这个条件需要什么where b.color = 'red'
-
很抱歉;我已经编辑了原始帖子。我正在尝试获取预订每艘 RED 船的水手列表,这是我的第一个查询所做的。
-
双重
NOT EXISTS(...)结构有什么问题?这是处理像您这样的关系划分问题的标准方法。在大多数情况下,它优于IN (...),因为它可以优雅地处理 NULL,并且不需要抑制重复。
标签: sql database relational-database relational-division