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

열 값이 고유하지 않은 모든 행을 반환하는 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



답변

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

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


답변

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

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)


답변

어때요?

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


답변

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


답변

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

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


답변

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

이 문제에 대한 더 나은 옵션으로 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가 가능합니다.


답변

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

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