如何检查返回一个多行的子查询中是否存在一个值?

时间:2018-12-15 06:57:11

标签: mysql sql database

我正在尝试提取电影类型不是“科幻”的电影的信息。但是我遇到了 string ProcessorNameString = "ProcessorNameString: not available"; string memory = "Memory: not availbale "; string freeSpace = "Free space: not available"; //add others try { ProcessorNameString = Registry.GetValue(@"HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0", "ProcessorNameString", null).ToString().Replace("(R)", "").Replace("(TM)", "") + Environment.NewLine; } catch{} try { memory = string.Format("Free Space:{0}DB", getRAMsize()); } catch { } try { //freeSpace here } catch { } TextBox1.Text = string.Format("{0}{1}{2}{3}{4}{5}" , ProcessorNameString, Environment.NewLine , memory, Environment.NewLine , freeSpace, Environment.NewLine); Clipboard.SetDataObject(TextBox1.Text); 错误,但我无法解决此问题。我正在使用以下查询:#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.

enter image description here

TABLE (with rows): film:

enter image description here

3 个答案:

答案 0 :(得分:2)

您应该写:

SELECT * FROM film WHERE id not in (SELECT id FROM genre WHERE type='Sci-Fi');

答案 1 :(得分:2)

我强烈建议您使用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列)。

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

答案 2 :(得分:1)

对于类型为LEFT JOIN的电影,您还可以使用Sci-Fi获得想要的结果,并检查表之间是否不匹配:

SELECT f.*
FROM film f
LEFT JOIN (SELECT DISTINCT id FROM genre WHERE type = 'Sci-Fi') g
  ON g.id = f.id
WHERE g.id IS NULL