2015-03-24 5 views
1

Если у вас есть две таблицы, которые вы собираете для сбора данных, но хотите удалить дубликаты - как это сделать?oracle 11g - удалить дубликаты записей после присоединения

У меня есть две таблицы; Студент и курс

Студент может пройти курс более одного раза, но, спрашивая: «Сколько учеников прошли курс 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 раза).

Кроме того, есть ли способ их сортировки по алфавиту при отображении?

ответ

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; 
+0

Спасибо! Я также обнаружил, что разные работы тоже. выбрать отдельный student_id from student_table join course_table using (student_id) где course_id = 123 и date_take между '01 -JAN-14 'AND '31 -DEC-14'; Любые идеи о том, почему нужно использовать группу или отдельную? Является ли более гибким, чем другой? Или это просто предпочтение? – johnnyjohnson123

+0

Несомненно! для получения дополнительной информации: http://sqlmag.com/database-performance-tuning/distinct-vs-group – alfasin

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' 

Также обратите внимание, как вам не нужно присоединяться к таблице учеников для подсчета.

Смежные вопросы