SQL Server Select语句查找某些字段的重复项

nwsw7zdq  于 2023-01-20  发布在  其他
关注(0)|答案(9)|浏览(151)

你能帮我用SQL语句查找多个字段的重复项吗?
例如,在伪代码中:

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

并且从上面的语句 * 如果存在多个出现 *,我想要选择 * 除了第一个记录之外的每个记录 *。

roejwanj

roejwanj1#

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

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

有关如何删除行的详细信息,请查看此链接。
http://support.microsoft.com/kb/139444
在你使用上面链接中的方法之前,应该有一个标准来决定你如何定义“第一行”。基于这个标准,你需要使用一个order by子句和一个子查询。如果你能发布一些示例数据,那将非常有帮助。

xbp102n0

xbp102n02#

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

bxpogfeg3#

这是我喜欢的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
8zzbczxx

8zzbczxx4#

要查看重复值:

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

muk1a3rh5#

如果您使用的是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

请注意,运行此示例后,每个“组”中的第一条记录都被排除,并且具有空值的记录得到了正确处理。
如果没有可用于对组中的记录进行排序的列,则可以使用分区依据列作为排序依据列。

brc7rcf0

brc7rcf06#

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
hec6srdp

hec6srdp7#

尝试使用此查询查找多个字段中的重复记录

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
oyjwcjzk

oyjwcjzk8#

您还可以尝试使用此查询来计算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;
pod7payv

pod7payv9#

尝试使用以下查询对每个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

相关问题