2012-10-30 38 views
77

Tôi cần chạy một câu lệnh chọn trả về tất cả các hàng có giá trị của một cột không khác biệt (ví dụ: EmailAddress).Cách chọn mỗi hàng mà giá trị cột KHÔNG khác biệt

Ví dụ, nếu bảng trông như dưới đây:

CustomerName  EmailAddress 
Aaron   [email protected] 
Christy   [email protected] 
Jason   [email protected] 
Eric    [email protected] 
John    [email protected] 

Tôi cần truy vấn trả lại:

Aaron   [email protected] 
Christy   [email protected] 
John    [email protected] 

Tôi đã đọc nhiều bài viết và cố gắng truy vấn khác nhau vô ích. Truy vấn mà tôi tin rằng sẽ hoạt động dưới đây. Ai đó có thể đề xuất một sự thay thế hoặc cho tôi biết điều gì có thể sai với truy vấn của tôi?

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

Trả lời

139

Đây là nhanh hơn so với EXISTS cách đáng kể:

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

Làm thế nào về

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

Chỉ cần cho vui, đây là một cách khác:

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

+1 cho phiên bản CTE Chúng ta không nên lặp lại chính mình trong mã, tại sao lặp lại chính mình trong SQL nếu chúng ta không phải làm nữa. – yzorg

+0

Tôi sử dụng _count cho cột đếm (trên num). Tôi luôn sử dụng dấu gạch dưới khi các cột xảy ra va chạm với các từ khóa SQL như _default, _type, _sum, v.v. – yzorg

23

Điều đó là không chính xác với truy vấn của bạn là bạn đang nhóm qua email và tên công ty có tạo thành một nhóm gồm mỗi bộ email và tên duy nhất được kết hợp với nhau và do đó

aaron and [email protected] 
christy and [email protected] 
john and [email protected] 

được coi là 3 nhóm khác nhau thay vì tất cả thuộc 1 nhóm đơn lẻ.

Vui lòng sử dụng các truy vấn như đưa ra dưới đây:

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

Tôi thích rằng bạn cũng bao gồm giải thích về những gì sai với truy vấn gốc, không giống như câu trả lời được chấp nhận. –

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

cải tiến nhỏ để hiển thị được tính là "dups": chọn CustomerName, đếm (1) dưới dạng dups từ nhóm Khách hàng theo Tên khách hàng có số (1)> 1' – DynamicDan

-1

Vâng có một thay đổi nhỏ để tìm các hàng không khác biệt ..

CHỌN EmailAddress, CustomerName FROM Customers WHERE EmailAddress NOT IN (CHỌN EmailAddress TỪ KHÁCH HÀNG GROUP BY EmailAddress CÓ COUNT (*)> 1)

0

Thay vì sử dụng truy vấn phụ ở nơi điều kiện sẽ tăng thời gian truy vấn nơi hồ sơ quá lớn.

Tôi khuyên bạn nên sử dụng Inner Join làm tùy chọn tốt hơn cho vấn đề này.

Xét cùng bảng này có thể cho kết quả

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

Để có kết quả vẫn tốt tôi sẽ đề nghị bạn sử dụng CustomerID hoặc bất kỳ lĩnh vực độc đáo của bảng. Bản sao của CustomerName là có thể.

Các vấn đề liên quan