SQL - поиск пар повторяющихся записей

Не могли бы вы помочь мне с одним запросом SQL?

Стол: студенты

Id | Имя | Дата рождения
1 завещание 1991-02-10
2 Джеймс 1981-01-20
3 Сам 1991-02-10

Мне нужно найти пары студентов, которые имеют одинаковую дату рождения. Однако мы не можем использовать GROUP BY, поэтому простая группировка и подсчет записей не является решением.

Я пытался сделать это с JOIN, но безуспешно.

Ваша помощь очень ценится!

3 ответа

Решение

Вы можете использовать самостоятельное соединение на столе, присоединяясь к date_of_birth колонка:

select s1.name,
       s2.name
from students s1
  join students s2 
    on s1.date_of_birth = s2.date_of_birth
   and s1.name < s2.name; 

Как wildplasser и dasblinkenlight указал на < оператор (или >) лучше чем <> потому что при использовании <> в состоянии соединения комбинация Will/Sam будет сообщена дважды.

Другой способ удалить дубликаты этих дубликатов - использовать отдельный запрос:

select distinct greatest(s1.name, s2.name), least(s1.name, s2.name)
from students s1
  join students s2 
    on s1.date_of_birth = s2.date_of_birth
   and s1.name <> s2.name;

(хотя устранение дубликатов в условии соединения почти наверняка более эффективно)

Этот запрос сообщает обо всех студентах, у которых есть неуникальная дата рождения.

SELECT *
FROM students s
WHERE EXISTS (
    SELECT *
    FROM students ex
    WHERE ex.dob = st.dob
    AND ex.name <> st.name
    )
ORDER BY dob
 ;
select st.name, stu.name
from students st, students stu
where st.date_of_birth = stu.date_of_birth AND and st.name <> stu.name;
Другие вопросы по тегам