SQL Server重复记录

SQL Server重复记录,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,您好,我已完成以下查询: UPDATE [dbo].[TestData] SET Duplicate = 'Duplicate within' WHERE exists (SELECT telephone, COUNT(telephone) FROM [dbo].[TestData] GROUP BY telephone HAVING (COUNT (telephone)>1)) 在那张表中,实际上有9条重复的电话记录 查询将整个重复列标记为“duplicate in”,而不是9条记录

您好,我已完成以下查询:

UPDATE [dbo].[TestData]
SET Duplicate = 'Duplicate within'
WHERE exists 
(SELECT telephone, COUNT(telephone)
FROM [dbo].[TestData]
GROUP BY telephone
HAVING (COUNT (telephone)>1))
在那张表中,实际上有9条重复的电话记录

查询将整个重复列标记为“duplicate in”,而不是9条记录

我还开发了下面的下一个查询,它将把18条重复记录解压为9条

UPDATE [dbo].[TestData]
SET Duplicate = 'NO'
WHERE ID IN (SELECT MIN(ID) FROM [dbo].[TestData] GROUP BY telephone)
这个问题不起作用,也没人能告诉我哪里出了问题

问题在于没有筛选EXISTS查询。每个手机都需要对其进行过滤:

UPDATE [dbo].[TestData]
SET Duplicate = 'Duplicate within'
FROM [TestData] t
WHERE EXISTS (
    SELECT telephone, COUNT(telephone)
    FROM [dbo].[TestData]
    WHERE telephone = t.telephone
    GROUP BY telephone
    HAVING (COUNT (telephone)>1))
)
问题是没有筛选EXISTS查询。每个手机都需要对其进行过滤:

UPDATE [dbo].[TestData]
SET Duplicate = 'Duplicate within'
FROM [TestData] t
WHERE EXISTS (
    SELECT telephone, COUNT(telephone)
    FROM [dbo].[TestData]
    WHERE telephone = t.telephone
    GROUP BY telephone
    HAVING (COUNT (telephone)>1))
)

您可以使用where-exists实现这一点,但这样写/读更容易,而且性能差异很可能最小

update TestData set 
    Duplicate = 'Duplicate within'
where 
    Telephone in (
        select Telephone 
        from TestData 
        group by Telephone 
        having count(*) > 1
    )
要将第一条记录与每个电话号码单独保留,并仅标记具有相同电话号码的后续记录,请使用cte,如下所示:

;with NumberedDupes as (
    select
        Telephone,
        Duplicate,
        row_number() over (partition by Telephone order by Telephone) seq
    from TestData
)
update NumberedDupes set Duplicate = 'Duplicate within' where seq > 1

您可以使用where-exists实现这一点,但这样写/读更容易,而且性能差异很可能最小

update TestData set 
    Duplicate = 'Duplicate within'
where 
    Telephone in (
        select Telephone 
        from TestData 
        group by Telephone 
        having count(*) > 1
    )
要将第一条记录与每个电话号码单独保留,并仅标记具有相同电话号码的后续记录,请使用cte,如下所示:

;with NumberedDupes as (
    select
        Telephone,
        Duplicate,
        row_number() over (partition by Telephone order by Telephone) seq
    from TestData
)
update NumberedDupes set Duplicate = 'Duplicate within' where seq > 1

如果您只想找到重复项,则需要查看下面的子选择所示的两条记录之一。EXISTS实际上会使您更新这两行,因为这是您正在测试的内容

    UPDATE [dbo].[TestData]
    SET Duplicate = 'Duplicate within'
    WHERE Id IN  
    (SELECT MAX(Id)
    FROM [dbo].[TestData]
    GROUP BY telephone
    HAVING (COUNT (telephone)>1))

如果您只想找到重复项,则需要查看下面的子选择所示的两条记录之一。EXISTS实际上会使您更新这两行,因为这是您正在测试的内容

    UPDATE [dbo].[TestData]
    SET Duplicate = 'Duplicate within'
    WHERE Id IN  
    (SELECT MAX(Id)
    FROM [dbo].[TestData]
    GROUP BY telephone
    HAVING (COUNT (telephone)>1))


@Ap9_Jacka,你发布的SQL不是我提供的SQL-你在评论中发布的SQL与你在问题中发布的SQL完全相同。不起作用并不奇怪。很抱歉出现了有效的类型错误,非常感谢!。下一个查询是否会以完整的工作格式取消STAMP 18到9?@Ap9_Jacka,只要您遵循相同的模式,它就会正常工作。您必须将FROM和筛选添加到EXISTS查询中。为什么在FROM[TestData]和t.telephone之间有一个t?@Ap9_Jacka,FROM[TestData]表示您希望在更新每一行之前对其进行评估,并且您希望这些评估来自[TestData],然后在EXISTS查询中,我们使用该表对其进行正确筛选。我们只想在我们所在的行中有更多类似的SQL时将其标记为重复项。@Ap9_Jacka,您发布的SQL不是我提供的SQL-您在评论中发布的SQL与您在问题中发布的SQL完全相同。不起作用并不奇怪。很抱歉出现了有效的类型错误,非常感谢!。下一个查询是否会以完整的工作格式取消STAMP 18到9?@Ap9_Jacka,只要您遵循相同的模式,它就会正常工作。您必须将FROM和筛选添加到EXISTS查询中。为什么在FROM[TestData]和t.telephone之间有一个t?@Ap9_Jacka,FROM[TestData]表示您希望在更新每一行之前对其进行评估,并且您希望这些评估来自[TestData],然后在EXISTS查询中,我们使用该表对其进行正确筛选。我们只想在我们所在的行中有更多类似的行时将其标记为重复行。您想做什么?您想做什么?如果我只想取消对重复行的缩放,因为有18个重复行,如何取消缩放回9个重复行?我的查询应该只更新9个重复行,使用插入的最后一个id作为重复行。非常感谢!所以前两行是更新和设置。MaxId位在做什么?我也在努力理解:我是SQLMaxID的新手,它在Id字段中找到了最高的值。这与GROUP BY和HAVING相结合,可以为具有相同电话值的所有行找到尽可能高的Id。如果我只想取消对重复行的缩放,因为有18行,我如何取消缩放回9行?我的查询应该只更新9行重复行,使用插入的最后一个Id作为重复行。非常感谢!所以前两行是更新和设置。MaxId位在做什么?我也在努力理解:我是SQLMaxID的新手,它在Id字段中找到了最高的值。这与GROUP BY和HAVING相结合,可以为具有相同电话值的所有行找到尽可能高的Id。如果我想像18一样取消对重复项的缩放,我如何取消缩放回9?不确定取消缩放是什么意思。是否要删除重复记录?或者您只想将每个副本中的一个标记为重复?我只想将每个副本中的一个标记为重复,因为上面的查询已在上面标记了18。我想把它标记为9+1。我认为第二个问题,CTE是O.P.想要的,但在他/她的问题中很难表达出来。如果我只想将重复项拆下,因为有18个,我如何将其拆回9?不确定您所说的拆下是什么意思。是否要删除重复记录?或者您只想标记e中的一个
ach作为副本?我只想标记每个副本中的一个,因为上面的查询在上面标记了18。我想把它标记为9+1。我认为第二个问题,CTE是O.P.想要的,但在他/她的问题中很难表达出来。