2015-09-16 7 views
0

Как найти повторяющиеся записи в столбце (например, несколько строк в столбце student_id) и соединить их с другой таблицей с общим идентификатором (например, student_id из другой таблицы, чтобы получить имя студента)?SQL: Сортировка по количеству записей строк и присоединению

сорта:

student_id,grade 
6,A 
1,B 
1,F 
7,C 
6,A 

студенты:

student_id,student_name 
1,roy 
6,bob 
7,art 

так, что я могу получить объединенную таблицу только дублирую студенческих рядов по student_id, который напоминает:

student_id,student_name,grade 
6,bob,A 
1,roy,B 
1,roy,F 
6,bob,A 

It было бы хорошо, чтобы просто вернуть n Ames самого последнего кадра данных:

bob 
roy 
+0

я не понимаю, вы хотите, только имя студента ? –

ответ

2

Попробуйте это:

select students.student_name 
from grades 
inner join students on grades.student_id = students.student_id 
group by student_name 
having count(*) > 1 

Пример:

create table grades (student_id int, grade char(1)); 
insert into grades values (6, 'A'), (1, 'B'), (1, 'F'), (7, 'C'), (6, 'A'); 
create table students (student_id int, student_name varchar(20)); 
insert into students values (1, 'roy'), (6,'bob'), (7,'art'); 

select students.student_name 
from grades 
inner join students on grades.student_id = students.student_id 
group by student_name 
having count(*) > 1 

Result: 
student_name 
bob 
roy 

Это должно привести к Бобу и Руа.

командной строки на Linux, если у вас есть SQLite:

~$ sqlite 
SQLite version 2.8.17 
Enter ".help" for instructions 
sqlite> create table grades (student_id int, grade char(1)); 
sqlite> insert into grades values (6, 'A'); 
sqlite> insert into grades values (1, 'B'); 
sqlite> insert into grades values (1, 'F'); 
sqlite> insert into grades values (7, 'C'); 
sqlite> insert into grades values (6, 'A'); 
sqlite> 
sqlite> create table students (student_id int, student_name varchar(20)); 
sqlite> insert into students values (1, 'roy'); 
sqlite> insert into students values (6,'bob'); 
sqlite> insert into students values (7,'art'); 
sqlite> 
sqlite> select students.student_name 
    ...> from grades 
    ...> inner join students on grades.student_id = students.student_id 
    ...> group by student_name 
    ...> having count(*) > 1; 
roy 
bob 
sqlite> 
+0

спасибо! Каков наилучший способ проверить ваше предложение в командной строке linux? У меня есть таблицы классов и учеников как отдельные файлы csv. Сначала я использовал pandas и sqlite3, но должен быть более чистый, быстрый путь! Что это? –

+1

Вы можете проверить это с помощью sqlfiddle.com. Я создал этот пример на скрипке: http://sqlfiddle.com/#!9/1365a/1 – zedfoxus

+1

Я отредактировал свой ответ, чтобы показать пример, который вы можете попробовать с помощью SQLite в Linux – zedfoxus

1

Найти дубликаты, а затем присоединиться к его обратно для получения дополнительной информации:

SELECT s.student_id, s.student_name 
FROM student s 
INNER JOIN 
    (SELECT g.student_id 
    FROM grades g 
    GROUP BY g.student_id 
    HAVING COUNT(*) > 1) dups 
ON s.student_id = dups.student_id 
+0

'COUNT (*)', а не ' COUNT (классы) '. См. Http://stackoverflow.com/questions/2876909/count-and-countcolumn-name-whats-the-diff – Barmar

+0

Спасибо @Barmar - обновлено –

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