у меня есть таблица как это
ID nachname vorname
1 john doe
2 john doe
3 jim doe
4 Michael Knight
Мне нужен запрос, который возвратит все поля (выбор *) от записей, которые имеют тот же nachname и vorname (в этом случае, записи 1 и 2). Кто-либо может помочь мне с этим?Спасибо
Следующий запрос даст список дубликатов:
SELECT n1.* FROM table n1
inner join table n2 on n2.vorname=n1.vorname and n2.nachname=n1.nachname
where n1.id <> n2.id
Кстати, опубликованные вами данные кажутся неправильными. «Лань» и «Рыцарь» - это фамилия, а не имя: p.
select * from table AS t1 inner join
(select max(id) As id,nachname,vorname, count(*)
from t1 group by nachname,vorname
having count(*) >1) AS t2 on t1.id=t2.id
Это должно вернуть ВСЕ столбцы из таблицы, где есть дубликаты nachname и vorname. Я рекомендую заменить * на те столбцы, которые вам нужны.
Edit: Я добавил max (id), чтобы не было проблем с группой by. Однако мой запрос не такой элегантный, как хотелось бы. Наверное, есть более простой способ сделать это.
Общее решение вашей проблемы - запрос формы
SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1
. Он вернет одну строку для каждого набора повторяющихся строк в таблице. Последний столбец в этом результате - это количество дубликатов для определенных значений.
Если вам действительно нужен идентификатор, попробуйте что-нибудь вроде этого:
SELECT id FROM
t1,
( SELECT col1, col2, count(*)
FROM t1
GROUP BY col1, col2
HAVING count(*) > 1 ) as t2
WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2
Хотя не проверял
Вы можете сделать это с помощью самосоединения:
select distinct t1.id from t as t1 inner join t as t2
on t1.col1=t2.col1 and t1.col2=t2.col2 and t1.id<>t2.id
t1.id <> t2.id
необходимо, чтобы идентификаторы не совпадали друг с другом. (Если вам нужна только одна строка из каждого набора дубликатов, вы можете использовать t1.id