Показать все повторяющиеся строки

Предположим, что у меня есть таблица 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 может быть любым количеством столбцов.