2

这是问题......我有这些表:

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 和表中选择一个注册号(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 行)。我知道我已经接近答案,但我不知道该怎么做。任何答案都会有帮助。谢谢你提前

4

3 回答 3

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)
于 2013-06-24T15:25:03.107 回答
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 演示

于 2013-06-24T15:36:50.857 回答
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)
于 2013-06-24T16:12:29.940 回答