如何在select中返回2行?

时间:2013-06-24 15:23:57

标签: mysql sql sql-server select where

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

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行)。我知道我接近答案但我不知道还能做什么。任何答案都会有所帮助。谢谢你提前

3 个答案:

答案 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)