如何检索在oracle中发生两次以上的记录?

时间:2012-03-06 11:15:27

标签: sql oracle sqlplus

我有这张桌子

create table student (
   stu_id int,
   s_name nvarchar(max),
   s_subject nvarchar(max),
)

这是数据

insert into student values(123,'pammy','English');
insert into student values(123,'pammy','Maths');
insert into student values(123,'pammy','Chemistry');
insert into student values(124,'watts','Biology');
insert into student values(125,'Tom','Physics');
insert into student values(125,'Tom','Computer';
insert into student values(125,'Tom','ED';

所以我想检索已发生两次以上的记录。我的代码是

select stu_id,s_Name 
from student 
group by stu_id,s_Name 
having count(stu_id) >2 ;

结果很完美。

但是当我想要s_subject时,它表示没有选择任何行。我不知道为什么。

select stu_id,s_Name,s_subject 
from student 
group by stu_id,s_Name,s_subject 
having count(stu_id) >2 ;

2 个答案:

答案 0 :(得分:24)

这是因为没有一个学生每个科目都有多个记录。

select stu_id,s_Name,s_subject 
from student 
group by stu_id,s_Name,s_subject 
having count(stu_id) >2 ;

此代码要求出现两次以上具有相同学生ID,姓名和科目的记录。您的样本中的所有记录都不符合此要求。

但是,如果您真正想要的是任何学生参加两个以上课程的ID,姓名和科目,这可以很容易地完成。

使用稍微修改过的初始SQL版本作为过滤器,我们得到:

select stu_id, name, subject
from student
where stu_id in (   select stu_id 
                    from student 
                    group by stu_id 
                    having count(stu_id) >2 );

希望这有帮助。

答案 1 :(得分:0)

由于您按表中的所有列进行分组,它将生成唯一的行(具有一个频率行的记录)。由于您已经选择了多于2的行,因此它将不具有频率为2的记录。 如果你将使用count = 1,你将获得count = 1,

的所有行
select stu_id,s_Name,s_subject 
from student 
group by stu_id,s_Name,s_subject
having count(stu_id) =1 ;

输出将是:

stu_id      s_Name      s_subject
   ----------- -------------
123         pammy       Chemistry
123         pammy       English
123         pammy       Maths
124         watts       Biology
125         Tom         Computer
125         Tom         ED
125         Tom         Physics