2011-11-16 22 views
69

Vì vậy, tôi muốn làm một cái gì đó giống như mã này sql dưới đây:Làm cách nào để tìm các bản sao trên nhiều cột?

select s.id, s.name,s.city 
from stuff s 
group by s.name having count(where city and name are identical) > 1 

Để tạo ra những điều sau đây, (nhưng bỏ qua mà chỉ có tên hoặc chỉ phù hợp với thành phố, nó phải được trên cả hai cột):

id  name city 
904834 jim London 
904835 jim London 
90145 Fred Paris 
90132 Fred Paris 
90133 Fred Paris 

Trả lời

96

trùng lắp id cho cặp namecity:

select s.id, t.* 
from [stuff] s 
join (
    select name, city, count(*) as qty 
    from [stuff] 
    group by name, city 
    having count(*) > 1 
) t on s.name = t.name and s.city = t.city 
+0

Lưu ý rằng nếu '' 'name''' hoặc' '' city''' chứa '' 'null''', thì chúng sẽ không được báo cáo trong truy vấn bên ngoài, nhưng sẽ được đối sánh trong truy vấn bên trong. –

+0

Nếu các giá trị có thể chứa '' 'null''' thì (trừ khi tôi thiếu một cái gì đó), bạn cần thay đổi nó thành' '' CROSS JOIN''' (sản phẩm đầy đủ Cartesian) và sau đó thêm '' ' Mệnh đề WHERE''' như: '' 'WHERE ((s.name = t.name) OR (s.name là null và t.name là null)) AND ((s.city = t.city) OR (s.city là null và t.city là null)) '' ' –

0

Bạn phải tự tham gia công cụ và khớp tên và thành phố. Sau đó nhóm theo số lượng.

select 
    s.id, s.name, s.city 
from stuff s join stuff p ON (
    s.name = p.city OR s.city = p.name 
) 
group by s.name having count(s.name) > 1 
+0

Không trong SQL Server: tất cả các cột không phải tổng hợp phải nằm trong GROUP BY – gbn

7

Một cái gì đó như thế này sẽ thực hiện thủ thuật. Không biết về hiệu suất, do đó, làm cho một số xét nghiệm.

select 
    id, name, city 
from 
    [stuff] s 
where 
1 < (select count(*) from [stuff] i where i.city = s.city and i.name = s.name) 
14
SELECT name, city, count(*) as qty 
FROM stuff 
GROUP BY name, city HAVING count(*)> 1 
0

Tìm hiểu kỷ lục trùng lặp cho nhiều hơn một cột, tốt nhất cách tự tham gia với Bảng

select * 
from [stuff] s 
join (
    select name, city 
    from [stuff] 
    group by name, city 
    having count(*) > 1 
) t on s.name = t.name and s.city = t.city 
0

Cho một bảng dàn dựng với 70 cột và chỉ 4 đại diện cho các bản sao, mã này sẽ trả về các cột vi phạm:

SELECT 
    COUNT(*) 
    ,LTRIM(RTRIM(S.TransactionDate)) 
    ,LTRIM(RTRIM(S.TransactionTime)) 
    ,LTRIM(RTRIM(S.TransactionTicketNumber)) 
    ,LTRIM(RTRIM(GrossCost)) 
FROM Staging.dbo.Stage S 
GROUP BY 
    LTRIM(RTRIM(S.TransactionDate)) 
    ,LTRIM(RTRIM(S.TransactionTime)) 
    ,LTRIM(RTRIM(S.TransactionTicketNumber)) 
    ,LTRIM(RTRIM(GrossCost)) 
HAVING COUNT(*) > 1 

.

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