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

例如,在伪代码中:

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

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


当前回答

如果您正在使用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

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

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

其他回答

试试这个查询,每个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

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

如果您正在使用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

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

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

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

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