sql - 从 NOT EXISTS 转换为 NOT IN

标签 sql database relational-database relational-division

我有三个表:

  • sailor(名字,等级);
  • boat(名称、颜色、评级);
  • 预订(姓名、姓名、工作日、开始、结束);

为了获得预订每艘红船的水手名单,我有:

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())。

感谢任何帮助

最佳答案

这很有趣;您可以在将 NOT EXISTS ( ... ) 替换为 IN ( ...) 时保持句法结构(相关子查询):

SELECT s.sname from sailor s
WHERE 13 NOT IN (
    SELECT 13 FROM boat b
    WHERE b.color = 'red'
    AND 42 NOT IN (
        SELECT 42 from reservation r
        WHERE r.bname = b.bname
        AND r.sname = s.sname
       )
    );

关于sql - 从 NOT EXISTS 转换为 NOT IN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697519/

相关文章:

mysql - 如果在 SQL 中结果为空,如何返回列值?

MySQL:连接语句:为什么这不起作用?

mysql - 分组用户,MySQL 上匹配的连续值

MySQL 守护进程拒绝以 "Can' 启动服务器 : Bind on TCP/IP port: Address already in use"(it's not).

java - Hibernate:如何使用同一个表(或实体)的两列(字段)创建约束

php - 排序依据,如果某些相同,则按 SQL 中的其他内容排序

sql - SQLITE更新操作

php - 多个SQL查询来选择数据MySql php

MySQL数据库一对一关系

javascript - 关联不同表中数据的最简单、最有效的方法,无需关联