31

次の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
4

11 に答える 11

58

重複したレコードを見つけましたが、それらに添付されているすべての情報を取得したいと考えています。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 joinand と同じであり、サブクエリ内のすべてのレコードについて、重複レコードが見つかった場合、メイン テーブルから最初と最後の組み合わせが同じものをすべて見つけることを意味します。

in を使用してこれを行うこともできますが、違いをテストする必要があります

select *
  from my_table a
 where ( firstname, lastname ) in   
       ( select firstname, lastname 
           from my_table 
          group by firstname, lastname 
         having count(*) > 1 )

参考文献:

于 2012-04-25T21:34:22.890 に答える
7
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ます。

于 2012-04-25T21:36:00.840 に答える
6

ベンの最初の答えをもう少し読みやすくする方法を次に示します。

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)
于 2012-04-25T21:48:01.420 に答える
6
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) 

ここに画像の説明を入力

于 2018-03-28T11:37:19.623 に答える
1

素敵なオプションは、テーブルからすべての重複した値を取得します

 select * from Employee where Name in (select Name from Employee group by Name having COUNT(*)>1)
于 2014-09-26T17:44:33.987 に答える
1

テーブルからすべての重複 ID を出力する場合は、次のようにします。

select * from table where id in (select id from table group By id having count(id)>1)
于 2016-09-17T04:04:41.147 に答える
1

これが最も簡単な方法です:

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)
于 2016-06-20T09:05:44.280 に答える
0

このクエリは重複を返します

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
        )                                         
于 2014-05-03T07:45:51.783 に答える