7

1つの列に重複があるテーブルから行を選択しようとしていますが、別の列に基づいて行を制限しています。正しく機能していないようです。

select Id,Terms from QueryData 
where Track = 'Y' and Active = 'Y'
group by Id,Terms
having count(Terms) > 1

削除すると正常にwhere機能しますが、これらの行のみに制限する必要があります。

ID      Terms     Track    Active
100     paper     Y        Y
200     paper     Y        Y
100     juice     Y        Y
400     orange    N        N
1000    apple     Y        N

理想的には、クエリは最初の2行を返す必要があります。

4

3 に答える 3

8
SELECT Id, Terms, Track, Active
FROM QueryData
WHERE Terms IN (
                SELECT Terms 
                FROM QueryData
                WHERE Track = 'Y' and Active = 'Y' 
                GROUP BY Terms
                HAVING COUNT(*) > 1
                )

SQLFiddleのデモ

データ:

ID      Terms     Track    Active
100     paper     Y        Y
200     paper     Y        Y
100     juice     Y        Y
400     orange    N        N
1000    apple     Y        N

結果:

Id      Terms     Track    Active
100     paper     Y        Y
200     paper     Y        Y
于 2012-12-17T22:36:09.497 に答える
1

あなたが何をしているのか正確に理解しないでください。inを使用count(Terms)しますhavingTerms、is はselect節の中にあります。これは、各レコードcount(Terms)が 1 になることを意味します。おそらく、リストTermsから除外する必要があります。select正直なところ、テーブルとクエリを再現しましたが、機能しません。

おそらくこれはあなたが探しているものです(?):

select Id, count(Terms) from QueryData 
where Track = 'Y' and Active = 'Y'
group by Id
having count(Terms) > 1
于 2012-12-17T19:57:03.340 に答える
1

これにより、基準を満たすすべての重複用語が返されます。

select Terms
from QueryData
where Track = 'Y' and Active = 'Y'
group by Terms
having count(*) > 1

http://sqlfiddle.com/#!3/18a57/2

これらの用語のすべての詳細が必要な場合は、この結果に参加できます。

;with dups as (
  select Terms
  from QueryData
  where Track = 'Y' and Active = 'Y'
  group by Terms
  having count(*) > 1
)
select
  qd.ID, qd.Terms, qd.Track, qd.Active
from 
  QueryData qd join
  dups d on qd.terms = d.terms

http://sqlfiddle.com/#!3/18a57/5

于 2012-12-17T19:57:59.473 に答える