#sql #postgresql
#sql #postgresql
Вопрос:
Итак, я пытаюсь найти способ запросить таблицу «люди» с атрибутом «имя», и я хотел бы запросить имена, которые встречаются как минимум дважды, при этом результаты должны быть разными.
Я думал о создании двух таблиц псевдонимов и объединении по имени, но я не могу понять это.
Вот что я попробовал:
SELECT DISTINCT name
FROM people AS S1
INNER JOIN people AS S2 USING name
WHERE S2.lastname <> S2.surname
Часть с фамилией, которую я сделал, чтобы удалить случаи появления имен из-за равенства двух таблиц (даже не уверен, правильно ли это).
Но в любом случае это уже не удалось, поскольку синтаксис неправильный.
Был бы признателен за помощь! Заранее спасибо.
Комментарии:
1.
... using (name) ...
Ответ №1:
Агрегирование — это простой метод, если вам нужны только имена:
select name
from persons
group by name
having count(*) > 1;
Если вам нужны исходные строки, используйте оконные функции:
select p.*
from (select p.*, count(*) over (partition by name) as cnt
from persons p
) p
where cnt >= 2;
Ответ №2:
Просто: используйте EXISTS()
[вам нужно выбрать из таблицы people только один раз, и вам не нужно использовать DISTINCT ] :
SELECT *
FROM people s1
WHERE EXISTS (SELECT *
FROM people s2
WHERE s2.name = s1.name
AND S2.lastname <> S1.lastname
);
КСТАТИ: предполагая, что lastname <—> фамилия была опечаткой?
Ответ №3:
select p.people_name, count(1) as cnt
from people p
group by 1
having cnt >=1