열 값이 다른 모든 행을 선택하는 방법


154

열 값이 고유하지 않은 모든 행을 반환하는 select 문을 실행해야합니다 (예 : EmailAddress).

예를 들어, 테이블이 다음과 같은 경우

CustomerName     EmailAddress
Aaron            aaron@gmail.com
Christy          aaron@gmail.com
Jason            jason@gmail.com
Eric             eric@gmail.com
John             aaron@gmail.com

반환 할 쿼리가 필요합니다.

Aaron            aaron@gmail.com
Christy          aaron@gmail.com
John             aaron@gmail.com

많은 게시물을 읽었으며 다른 쿼리를 사용해 보았습니다. 내가 작동해야한다고 생각하는 쿼리는 다음과 같습니다. 누군가 대안을 제안하거나 내 질문에 어떤 문제가 있는지 말해 줄 수 있습니까?

select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1

답변:


263

이것은 EXISTS방법 보다 훨씬 빠릅니다 .

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
  (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)

1
이 답변이 7 살이라는 것을 알고 있습니다. 그래도 문제가 해결되지 않으면 어떻게 작동하는지 설명해 주시겠습니까? 내 문제도 해결되었습니다!
Lou

4
HAVING두 번째 대신 here를 사용하면 SELECT...WHERE두 번째 SELECT...WHERE호출을 여러 번 실행하는 두 번째 옵션 대신 단일 쿼리가됩니다 . 자세한 내용은 여기를 참조하십시오 : stackoverflow.com/q/9253244/550975
Serj 세이건

악명 높은 [EmailAddress] must appear in the GROUP BY clause or be used in an aggregate function오류가 발생합니다. 유일한 수정-편집 sql_mode입니까?
Volodymyr Bobyr

[EmailAddress]상기에서 IS GROUP BY
Serj 사간

51

쿼리에서 잘못된 것은 전자 메일 및 이름으로 그룹화하는 것입니다. 전자 메일 및 이름별로 그룹화되어 고유 한 전자 메일 집합 및 이름 그룹이 결합되어

aaron and aaron@gmail.com
christy and aaron@gmail.com
john and aaron@gmail.com

하나의 단일 그룹에 속하는 3 개의 다른 그룹으로 취급됩니다.

아래 주어진 쿼리를 사용하십시오 :

select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)

21
수락 된 답변과 달리 원래 쿼리의 문제점에 대한 설명도 포함 시켰습니다.

12

어때요?

SELECT EmailAddress, CustomerName FROM Customers a
WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)

11
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1

카운트를 "dups"로 표시하기위한 작은 기능 향상 : count (1)> 1`을 갖는 CustomerName으로 Customers 그룹에서 딥으로 CustomerName, count (1)을 선택합니다.
DynamicDan

8

재미를 위해 다른 방법이 있습니다.

;with counts as (
    select CustomerName, EmailAddress,
      count(*) over (partition by EmailAddress) as num
    from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1

1
CTE 버전 +1 우리는 코드에서 반복해서는 안되며, 더 이상 필요하지 않으면 SQL에서 반복해야합니다.
yzorg

1
개수 열에 _count를 사용합니다 (숫자 초과). 열이 _default, _type, _sum 등과 같은 SQL 키워드와 충돌 할 때 일관성있게 밑줄을 사용합니다.
yzorg

4

레코드가 큰 쿼리 시간을 늘리는 조건에서 하위 쿼리를 사용하는 대신

이 문제에 대한 더 나은 옵션으로 Inner Join을 사용하는 것이 좋습니다.

동일한 테이블을 고려하면 결과를 얻을 수 있습니다.

SELECT EmailAddress, CustomerName FROM Customers as a 
Inner Join Customers as b on a.CustomerName <> b.CustomerName and a.EmailAddress = b.EmailAddress

더 나은 결과를 얻으 CustomerID려면 테이블의 고유 한 필드 또는 사용하는 것이 좋습니다 . 복제 CustomerName가 가능합니다.


-2

고유하지 않은 행을 찾기 위해 약간의 변경이 있습니다.

SELECT EmailAddress, CustomerName FROM Customers WHERE EmailAddress NOT IN
(SELECT EmailAddress FROM Customers GROUP BY EmailAddress HAVING COUNT(*) > 1)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.