oracle 11g - 加入后删除重复的条目

时间:2015-03-24 20:44:08

标签: sql oracle oracle11g

如果您有两个表来加入以收集数据,但想要删除重复项 - 这是如何完成的?

我有两张桌子;学生和课程

学生可以多次参加一门课程,但在询问过去一年中有多少学生参加了123课程。 - 你不想多次计算那个学生,即使他可能多次参加过该课程。

示例代码:

select student_id
from student_table
join course_table using (student_id)
where course_id = 123 
and date_taken between '01-JAN-14' AND '31-DEC-14'

当我跑步时,我会让一些学生出现2到3次,因为他们可能在这段时间内完成了2到3次课程(失败一次或两次,不得不重修课程2或3次)。

此外,还有一种快速的方法可以在显示时按字母顺序对它们进行排序吗?

2 个答案:

答案 0 :(得分:0)

只需按student_id分组:

 select student_id 
 from student_table  
 join course_table using (student_id) 
 where course_id = 123 and 
 date_taken between '01-JAN-14' AND '31-DEC-14' 
 group by student_id;

您可以使用order by进行排序:

 select student_name, student_id 
 from student_table  
 join course_table using (student_id) 
 where course_id = 123 and 
 date_taken between '01-JAN-14' AND '31-DEC-14' 
 group by student_id
 order by student_name asc;

顺便说一句,你可能想要使用真正的日期而不是字符串 - 就像你所做的那样:

 select student_name, student_id 
 from student_table  
 join course_table using (student_id) 
 where course_id = 123 and 
 date_taken between TO_DATE('2014/01/01', 'yyyy/mm/dd') AND 
 TO_DATE('2014/12/31', 'yyyy/mm/dd')
 group by student_id
 order by student_name asc;

答案 1 :(得分:0)

要查找所有参加过课程的学生(至少一次),请使用distinct

select distinct student_table.*
from student_table
join course_table using (student_id)
where course_id = 123 
and date_taken between '01-JAN-14' AND '31-DEC-14'

要简单计算有多少不同的学生参加课程,请使用COUNT(DISTINCT student_id)

select count(distinct student_id)
from course_table
where course_id = 123
and date_taken between '01-JAN-14' AND '31-DEC-14'

另请注意您不需要加入学生表计数。