我正在尝试提取电影类型不是“科幻”的电影的信息。但是我遇到了 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.
TABLE (with rows): film:
答案 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
,每部电影每流派一行(带有filmId
和genreId
列)。第三个表称为联结表或关联表。
答案 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