2011-11-16 16 views
69
(名前のみまたは唯一の都市の試合は、それが両方の列になければならないところが、無視)

複数の列にわたって重複を見つけるにはどうすればよいですか?

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

以下を生成するために::

は、だから私は下のこのSQLコードのような何かをしたい

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

答えて

96

ペアnamecityためidを重複:

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

「 '' name'''または '' 'city'''のいずれかに' '' null'''が含まれている場合、外部クエリではレポートに失敗しますが、内部クエリでは一致します。 –

+0

値に '' 'null'''が含まれている可能性がある場合は(何かが欠落していない限り)' '' CROSS JOIN'''(完全なデカルト積)に変更してから '' ' WHERE((s.name = t.name)OR(s.nameがヌルでt.nameがヌル))AND((s.city = t.city)OR( s.cityがヌルで、t.cityがヌルです)) '' ' –

0

あなたは自分自身を参加させ、名前と都市を一致させる必要があります。その後、カウントでグループ化します。

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

SQL Serverで失敗しました:集約していないすべての列は、GROUP BYにある必要があります。 – gbn

7

これと同じようなことがトリックです。パフォーマンスについて知りませんので、いくつかのテストを行ってください。

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

が複数の列に重複レコードを見つける、最善の方法自己表で

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

を考えるに参加します70列、重複を表す4つしかないステージング表 このコードは問題の列を返します:

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 

関連する問題