我有两个表,一个名为STUDENTS
,另一个名为CLASSES
。我必须选择所有来自同一班级的学生,并且这个学生有自己的号码ID,通过这个号码我必须选择所有内容。
TABLE STUDENTS
nr_rgm
nm_name
nm_father
nm_mother
dt_birth
id_sex
TABLE CLASSES
cd_class
nr_schoolyear
cd_school
cd_degree
nr_series
cd_class
cd_period
所以我尝试了类似的东西:
SELECT count(*) FROM students, classes WHERE id_sex = 'M' AND
cd_class = (SELECT cd_class FROM classes WHERE nr_rgm = '12150');
但是它指出了一个错误,错误如下:
单行子查询返回多行
那么,我怎样才能做到这一点?
答案 0 :(得分:2)
应用子选择时应使用“in”而不是“=”。
答案 1 :(得分:1)
我认为你真正想做的是简单地将两个表连接起来而不是发出一个子选择:
SELECT count(*)
FROM students s, classes c
WHERE s.id_sex = 'M' AND c.nr_rgm = '12150' AND s.cd_class = c.cd_class;
这样你只需告诉数据库:请计算我的students.id_sex ='M'和我的classes.nr_rgm ='12150'所有发生的事件和所有找到的studends.cd_class与我的classes.cd_class匹配。
上面的语句失败的原因是因为普通=
操作在未在连接中使用时,只会期望一个值,就像您对s.id_sex='M'
一样,而您的语句返回多个值。为了解决这个问题,你必须使用在列表上运行的IN
运算符。
但是,只需将两个表连接在一起就可以实现同样的目标,并且在更大的数据集上效率会更高。
上面的例子再说一遍。如果classes.nr_rgm是数据类型NUMBER
的字段,请不要在值'
周围使用12150
,因为它会导致隐式类型转换。换句话说,'12150'
是一个字符串,在进行比较之前必须首先转换为NUMBER
。