选择语句以查找某些字段的重复项

JOE*_*EET 410 sql t-sql sql-server sql-server-2008

你能帮我用SQL语句来查找多个字段的重复项吗?

例如,在伪代码中:

select count(field1,field2,field3) 
from table 
where the combination of field1, field2, field3 occurs multiple times
Run Code Online (Sandbox Code Playgroud)

并且从上面的陈述中,如果有多次出现,我想选择除第一个以外的每个记录.

Raj*_*thi 834

要获取有多个记录的字段列表,您可以使用..

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1
Run Code Online (Sandbox Code Playgroud)

有关如何删除行的更多信息,请查看此链接.

http://support.microsoft.com/kb/139444

编辑:正如其他用户所提到的,在使用上述链接中的方法之前,应该有一个标准来决定如何定义"第一行".基于此,您需要使用order by子句和子查询(如果需要).如果您可以发布一些示例数据,那将非常有用.


Hei*_*nzi 42

你提到"第一个",所以我假设你对你的数据有某种排序.我们假设您的数据是按某个字段排序的ID.

除了第一个条目之外,此SQL应该为您提供重复的条目.它基本上选择具有(a)相同字段和(b)较低ID的另一行的所有行.性能不会很好,但它可能会解决您的问题.

SELECT A.ID, A.field1, A.field2, A.field3
  FROM myTable A
 WHERE EXISTS (SELECT B.ID
                 FROM myTable B
                WHERE B.field1 = A.field1
                  AND B.field2 = A.field2
                  AND B.field3 = A.field3
                  AND B.ID < A.ID)
Run Code Online (Sandbox Code Playgroud)


Nic*_*aro 17

这是我喜欢的SQL Server 2005的有趣解决方案.我将假设"除了第一个记录之外的所有记录",你的意思是我们可以使用另一个"id"列来识别哪一行是"第一个".

SELECT id
    , field1
    , field2
    , field3
FROM
(
    SELECT id
        , field1
        , field2
        , field3
        , RANK() OVER (PARTITION BY field1, field2, field3 ORDER BY id ASC) AS [rank]
    FROM table_name
) a
WHERE [rank] > 1
Run Code Online (Sandbox Code Playgroud)


小智 6

要查看重复值

with MYCTE  as (
    select row_number() over ( partition by name  order by name) rown, *
    from tmptest  
    ) 
select * from MYCTE where rown <=1
Run Code Online (Sandbox Code Playgroud)