Показать все повторяющиеся строки
Предположим, что у меня есть таблица sql
objid firstname lastname active
1 test test 0
2 test test 1
3 test1 test1 1
4 test2 test2 0
5 test2 test2 0
6 test3 test3 1
Теперь меня интересует результат:
objid firstname lastname active
1 test test 0
2 test test 1
4 test2 test2 0
5 test2 test2 0
Как я могу это достичь?
Я пробовал следующий запрос,
select firstname,lastname from table
group by firstname,lastname
having count(*) > 1
Но этот запрос дает такие результаты, как
firstname lastname
test test
test2 test2
Ответы
Ответ 1
Вы нашли дублированные записи, но заинтересованы в том, чтобы получить всю информацию, прилагаемую к ним. Вам нужно join
ваши дубликаты к основной таблице, чтобы получить эту информацию.
select *
from my_table a
join ( select firstname, lastname
from my_table
group by firstname, lastname
having count(*) > 1 ) b
on a.firstname = b.firstname
and a.lastname = b.lastname
Это то же самое, что и inner join
и означает, что для каждой записи в вашем подзапросе, в которой были найдены повторяющиеся записи, вы найдете все из основной таблицы, которая имеет одинаковую комбинацию "первый и последний".
Вы также можете сделать это с помощью in, хотя вы должны проверить разницу:
select *
from my_table a
where ( firstname, lastname ) in
( select firstname, lastname
from my_table
group by firstname, lastname
having count(*) > 1 )
Дальнейшее чтение:
Ответ 2
SELECT DISTINCT t1.*
FROM myTable AS t1
INNER JOIN myTable AS t2
ON t1.firstname = t2.firstname
AND t1.lastname = t2.lastname
AND t1.objid <> t2.objid
Это будет выводить каждую строку с дубликатом на основе firstname
и lastname
.
Ответ 3
SELECT user_name,email_ID
FROM User_Master WHERE
email_ID
in (SELECT email_ID
FROM User_Master GROUP BY
email_ID HAVING COUNT(*)>1)
![enter image description here]()
Ответ 4
Вот немного более четкий способ сделать первый ответ Бена:
WITH duplicates AS (
select firstname, lastname
from my_table
group by firstname, lastname
having count(*) > 1
)
SELECT a.*
FROM my_table a
JOIN duplicates b ON (a.firstname = b.firstname and a.lastname = b.lastname)
Ответ 5
nice option получает все дублируемое значение из таблиц
select * from Employee where Name in (select Name from Employee group by Name having COUNT(*)>1)
Ответ 6
Это самый простой способ:
SELECT * FROM yourtable a WHERE EXISTS (SELECT * FROM yourtable b WHERE a.firstname = b.firstname AND a.secondname = b.secondname AND a.objid <> b.objid)
Ответ 7
Если вы хотите напечатать все повторяющиеся идентификаторы из таблицы:
select * from table where id in (select id from table group By id having count(id)>1)
Ответ 8
Этот ответ может быть не очень хорошим, но я думаю, что это просто понять.
SELECT * FROM table1 WHERE (firstname, lastname) IN ( SELECT firstname, lastname FROM table1 GROUP BY firstname, lastname having count() > 1);
Ответ 9
Этот запрос возвращает дубликаты
SELECT * FROM (
SELECT a.*
FROM table a
WHERE (`firstname`,`lastname`) IN (
SELECT `firstname`,`lastname` FROM table
GROUP BY `firstname`,`lastname` HAVING COUNT(*)>1
)
)z WHERE z.`objid` NOT IN (
SELECT MIN(`objid`) FROM table
GROUP BY `firstname`,`lastname` HAVING COUNT(*)>1
)
Ответ 10
Я удивлен, что нет ответа с помощью функции окна. Я только что наткнулся на этот вариант использования, и это помогло мне.
select t.objid, t.firstname, t.lastname, t.active
from
(
select t.*, count(*) over (partition by firstname, lastname) as cnt
from my_table t
) t
where t.cnt > 1;
Скрипка - https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=c0cc3b679df63c4d7d632cbb83a9ef13
Формат идет как
select
tbl.relevantColumns
from
(
select t.*, count(*) over (partition by key_columns) as cnt
from desiredTable t
) as tbl
where tbl.cnt > 1;
Этот формат выбирает из таблицы все необходимые вам столбцы (иногда все столбцы), где count > 1
для key_columns
используется для идентификации дублирующихся строк. key_columns
может быть любым количеством столбцов.