188

列の値が明確でないすべての行を返す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
4

7 に答える 7

319

EXISTSこれは、方法よりも大幅に高速です。

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
  (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
于 2013-10-11T20:26:51.373 に答える
63

クエリで間違っているのは、電子メールと名前でグループ化していることです。これにより、電子メールと名前の一意の各セットが組み合わされてグループが形成されます。

aaron and aaron@gmail.com
christy and aaron@gmail.com
john and aaron@gmail.com

すべてが1つの単一グループに属するのではなく、3つの異なるグループとして扱われます。

以下のクエリを使用してください。

select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)
于 2012-10-30T19:49:14.977 に答える
21
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
于 2013-07-03T06:29:21.263 に答える
12

どうですか

SELECT EmailAddress, CustomerName FROM Customers a
WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)
于 2012-10-30T19:34:08.923 に答える
9

楽しみのために、ここに別の方法があります:

;with counts as (
    select CustomerName, EmailAddress,
      count(*) over (partition by EmailAddress) as num
    from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1
于 2012-10-30T19:38:15.653 に答える
4

レコードが巨大な場所でクエリ時間を増やすwhere条件でサブクエリを使用するのではなく。

この問題に対するより良いオプションとして、内部結合を使用することをお勧めします。

同じテーブルを考慮すると、これにより結果が得られる可能性があります

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

CustomerIDさらに良い結果を得るには、テーブルの任意の一意のフィールドを使用することをお勧めします。の複製CustomerNameが可能です。

于 2016-09-19T05:29:52.347 に答える
0
SELECT        Title, Id
FROM            dbo.TblNews
WHERE        (Title IN
      (SELECT  Title 
FROM dbo.TblNews AS TblNews_1
GROUP BY Title
HAVING (COUNT(*) > 1)))
ORDER BY Title
  • タイトルで並べ替え
于 2021-04-11T13:33:07.277 に答える