首页 > 解决方案 > 如何检查返回多于 1 行的子查询中是否存在值?

问题描述

我正在尝试提取类型不是“科幻”的电影的信息。但我遇到了一个错误,#1242 - Subquery returns more than 1 row我无法解决这个问题。我正在使用此查询:SELECT * FROM film WHERE id != (SELECT id FROM genre WHERE type='Sci-Fi');获取结果。我想我必须修复该id !=区域,但我不知道检查电影的当前 id 是否存在于返回的 id 行中的命令。请帮我解决一下这个。另外我是新手,SQL所以如果我当前的数据库不适合这个特定任务,请在下面发表评论。

IF THERE IS BETTER WAY TO STORE genres OF INDIVIDUAL FILMS, PLEASE LET ME KNOW.

TABLE (with rows): film:

在此处输入图像描述

TABLE (with rows): genre:

在此处输入图像描述

标签: mysqlsqldatabase

解决方案


我强烈建议使用not exists而不是not in. 有一个很好的理由。如果子查询返回的任何值为NULL,则not in过滤掉所有行。这种行为与 的含义是一致的NULL,但它是高度违反直觉的。

所以我会推荐:

SELECT f.*
FROM film f
WHERE NOT EXISTS (SELECT 1
                  FROM genre g
                  WHERE g.id = f.id
                 );

您还询问您的数据结构。你应该有三个表:

  • films, 每部电影一行一filmId
  • genres,每个流派(如“科幻”)一行,一genreId列。
  • filmGenres,每部电影每种类型一行(带有filmIdgenreId列)。

第三个表称为联结表或关联表。


推荐阅读