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

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

例如,在伪代码中:

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

从上面的语句如果有多次发生中,我想选择除了第一张以外的每一张唱片

788052 次浏览

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

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)

如果您正在使用SQL Server 2005或更高版本(并且您的问题的标签指示SQL Server 2008),如果由于某种原因使用连接不太理想或不切实际,则可以使用排序函数返回第一个记录之后的重复记录。下面的示例展示了它的实际操作,其中它也适用于检查的列中的空值。

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

注意,在运行这个示例之后,每个“组”中的第一条记录都被排除在外,具有空值的记录将被正确处理。

如果没有可用于对组内的记录进行排序的列,则可以使用按分区列作为按顺序列。

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

要查看重复值:

with MYCTE  as (
select row_number() over ( partition by name  order by name) rown, *
from tmptest
)
select * from MYCTE where rown <=1
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

尝试这个查询,每个SELECT语句有单独的计数:

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

尝试此查询以查找多个字段上的重复记录

SELECT a.column1, a.column2
FROM dbo.a a
JOIN (SELECT column1,
column2, count(*) as countC
FROM dbo.a
GROUP BY column4, column5
HAVING count(*) > 1 ) b
ON a.column1 = b.column1
AND a.column2 = b.column2

你也可以尝试用这个查询来计算你想要的列的distinct()列和order by列:

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