SQL SELECT全行,一列中有重复的数据

时间:2018-08-16 06:31:00

标签: sql sql-server tsql

我正在使用Microsoft SQL Server 2014。

我能够列出重复的电子邮件。

但是我无法列出整个行,其中包含其他字段,例如EmployeeIdUsernameFirstNameLastName等。

SELECT Email, 
COUNT(Email) AS NumOccurrences
FROM EmployeeProfile
GROUP BY Email
HAVING ( COUNT(Email) > 1 )

我可以知道如何在包含Email的表中多次出现的行中列出所有字段吗?

谢谢。

4 个答案:

答案 0 :(得分:2)

尝试一下:

WITH DataSource AS
(
    SELECT *
          ,COUNT(*) OVER (PARTITION BY email) count_calc
    FROM EmployeeProfile
)
SELECT *
FROM DataSource
WHERE count_calc > 1

答案 1 :(得分:1)

select distinct * from EmployeeProfile where email in (SELECT 
Email
FROM EmployeeProfile
GROUP BY Email
HAVING COUNT(*) > 1 )

答案 2 :(得分:1)

SQL Fiddle

with cte as (
  select *
  , count(1) over (partition by email) noDuplicates
  from Demo
)
select *
from cte
where noDuplicates > 1
order by Email, EmployeeId

说明:

我在这里使用了通用表表达式(cte);但您同样可以使用子查询;没关系。

此cte / subquery提取每一行,并包含一个名为noDuplicates的新字段,该字段表示有多少记录具有相同的电子邮件地址(包括记录本身;因此noDuplicates = 1实际上意味着没有重复;而noDuplicates = 2意味着记录本身和1个重复项,或2个具有此电子邮件地址的记录)。使用窗口上的聚合函数计算此字段。您可以在这里阅读窗口功能:https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql?view=sql-server-2017

在外部查询中,我们仅选择noDuplicates大于1的那些记录;也就是说,有多个记录具有相同的邮件地址。

最后,我已经按电子邮件和EmployeeId进行了排序;这样一来,重复项就会一并列出,并按照(大概)创建它们的顺序显示;只是为了使随后处理这些结果的人的生活变得轻松。

答案 3 :(得分:0)

如果grep("[0-9] E", strings, value = TRUE) 是唯一的,那么您可以EmployeeId

EXISTS