select语句以查找某些字段上的重复项

你能帮我用SQL语句在多个领域find重复?

例如,在伪代码中:

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

从上面的陈述中, 如果有多个事件,我想select除了第一个以外的每个logging

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

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

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

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

编辑:正如其他用户提到的,在上面的链接中使用该方法之前,应该有一个标准来决定如何定义“第一行”。 基于此,如果需要,您将需要使用order by子句和子查询。 如果你可以发布一些样本数据,那真的很有帮助。

你提到“第一个”,所以我假设你有一些对你的数据进行sorting。 假设您的数据是按某个字段IDsorting的。

这个SQL应该会得到除第一个以外的重复条目。 它基本上select所有具有(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) 

这是一个有趣的SQL Server 2005解决scheme,我喜欢。 我将假定通过“除了第一个logging以外的每个logging”,你的意思是还有另外一个“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 

要看到重复的价值

 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或更高版本(并且问题的标记指示SQL Server 2008),则可以使用排名函数在第一个返回logging之后返回重复logging,如果由于某些原因使用联接不太理想或不切实际的话。 以下示例显示了这一点,它也在所检查的列中使用空值。

 create table Table1 ( Field1 int, Field2 int, Field3 int, Field4 int ) insert Table1 values (1,1,1,1) , (1,1,1,2) , (1,1,1,3) , (2,2,2,1) , (3,3,3,1) , (3,3,3,2) , (null, null, 2, 1) , (null, null, 2, 3) select * from (select Field1 , Field2 , Field3 , Field4 , row_number() over (partition by Field1 , Field2 , Field3 order by Field4) as occurrence from Table1) x where occurrence > 1 

运行这个例子之后,请注意排除了每个“组”中的第一条logging,并且正确处理了具有空值的logging。

如果您没有可用于在组内排列logging的列,则可以使用partition-by列作为order-by列。

 CREATE TABLE #tmp ( sizeId Varchar(MAX) ) INSERT #tmp VALUES ('44'), ('44,45,46'), ('44,45,46'), ('44,45,46'), ('44,45,46'), ('44,45,46'), ('44,45,46') SELECT * FROM #tmp DECLARE @SqlStr VARCHAR(MAX) SELECT @SqlStr = STUFF((SELECT ',' + sizeId FROM #tmp ORDER BY sizeId FOR XML PATH('')), 1, 1, '') SELECT TOP 1 * FROM ( select items, count(*)AS Occurrence FROM dbo.Split(@SqlStr,',') group by items having count(*) > 1 )K ORDER BY K.Occurrence DESC