这是问题......我有这些表:
crs
title|semester
c++ |a
java |b
sql |a
crsstu
regnum|title
11131 |java
11131 |c++
11132 |java
11132 |sql
11133 |c++
11133 |sql
我想要做的是从crsstu和table中选择一个注册号码(regnum),我想知道他还没有注册哪些课程。 示例:如果我选择regnum 11131然后它必须返回sql,或者使用11132它返回c ++。
我走到了这一步:
select a.title
from crs as a,crsstu as b
where b.registrationnumber != 11133
and a.title != (select title
from crsstu
where registrationnumber = 11133)
但是它显示了一个1242错误(子查询返回超过1行)。我知道我接近答案但我不知道还能做什么。任何答案都会有所帮助。谢谢你提前
答案 0 :(得分:3)
只需将!=
更改为NOT IN
即可。 IN和NOT IN允许与一组项目进行比较。
select a.title
from crs as a,crsstu as b
where b.registrationnumber != 11133
and a.title NOT IN (select title
from crsstu
where registrationnumber = 11133)
答案 1 :(得分:2)
NOT IN
是可能的解决方案之一,但您的查询也过于复杂。
应该只是
SELECT title FROM crs
WHERE title NOT IN (SELECT title FROM crsstu WHERE regnum = 11131)
也可以使用NOT EXISTS
SELECT a.title FROM crs a
WHERE NOT EXISTS (SELECT * FROM crsstu b WHERE a.Title = b.Title AND b.regnum = 11131)
或LEFT JOIN
SELECT * FROM crs a
LEFT JOIN crsstu b ON a.Title = b.Title AND b.regnum = 11131
WHERE b.regnum IS NULL
<强> SQLFiddle DEMO 强>
答案 2 :(得分:0)
使用Join会更好:
select title,regnum
from crs as a join crsstu as b
on a.title = b.title
where b.regnum != 11133
and a.title NOT IN (select title
from crsstu
where registrationnumber = 11133)