你能帮我用SQL语句在多个字段上找到重复吗?

例如,在伪代码中:

select count(field1,field2,field3) 
from table 
where the combination of field1, field2, field3 occurs multiple times

从上面的语句中,如果有多次出现,我想选择除第一个之外的每一个记录。


当前回答

要获得包含多条记录的字段列表,可以使用..

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1

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

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

在使用上面链接中的方法之前,应该有一个标准来决定如何定义“第一行”。在此基础上,如果需要,您将需要使用order by子句和子查询。如果你能发布一些样本数据,那将会很有帮助。

其他回答

你提到了“第一个”,所以我假设你对你的数据有某种排序。让我们假设您的数据是按某个字段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)

你也可以尝试这个查询来计数一个不同的()列,并根据你想要的列进行排序:

select field1, field2, field3, count(distinct (field2))
from table_name
group by field1, field2, field3
having count(field2) > 1
order by field2;

要查看重复值:

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

这是我喜欢的一个有趣的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

要获得包含多条记录的字段列表,可以使用..

select field1,field2,field3, count(*)
  from table_name
  group by field1,field2,field3
  having count(*) > 1

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

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

在使用上面链接中的方法之前,应该有一个标准来决定如何定义“第一行”。在此基础上,如果需要,您将需要使用order by子句和子查询。如果你能发布一些样本数据,那将会很有帮助。