【问题标题】:How to use NOT IN operator in SQL如何在 SQL 中使用 NOT IN 运算符
【发布时间】:2019-11-15 22:00:03
【问题描述】:

编写查询以显示所有没有视频的电影的电影编号、电影名称和电影年份。 您将需要使用嵌套查询方法。使用返回所有电影编号的查询结果 表视频。这将是子查询。将 NOT IN 运算符应用于主查询中的子查询结果 然后定义标准。

select m.movie_num, m.movie_title, m.movie_year
from movie m, video v
where m.movie_num = v.movie_num;

【问题讨论】:

  • 请使用正确的JOIN。它已经存在超过 25 年了!

标签: sql oracle notin


【解决方案1】:

使用not exists:

select m.movie_num, m.movie_title, m.movie_year
from movie m
where not exists (select 1
                  from video v
                  where m.movie_num = v.movie_num
                 );

我强烈反对将not in 与子查询一起使用。如果子查询中的 any 行返回 NULL,它的行为会很奇怪。在这种情况下,根本不会返回任何行

您可以使用NOT EXISTS 表达任何NOT IN。通常,您不希望子查询中的 NULL 值排除所有结果。始终使用NOT EXISTS,您就不会遇到这个问题。

【讨论】:

  • 你的意思是“总是使用NOT EXISTS”?
  • @Eric 。 . .谢谢。
【解决方案2】:

这是left join 反模式的典型用例:

select m.movie_num, m.movie_title, m.movie_year
from movie m
left join video v on  m.movie_num = v.movie_num
where v.movie_num is null

这句话是:对于每部电影,尝试定位每部电影的video(s),并过滤不存在​​视频的电影。

这也可以用not exists 条件表示:

select m.movie_num, m.movie_title, m.movie_year
from movie m
where not exists (select 1 from video v where m.movie_num = v.movie_num)

【讨论】:

    【解决方案3】:

    对于这个你必须使用NOT IN的要求,你可以这样做

    select movie_num, movie_title, movie_year
    from movie 
    where movie_num not in (
      select movie_num
      from video
    );
    

    在这种情况下,可以安全地假设表video 中的movie_num 列中没有NULLs。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-11
      相关资源
      最近更新 更多