【问题标题】:Update Query using a Subquery to mark Duplicates使用子查询更新查询以标记重复项
【发布时间】:2021-03-31 08:27:30
【问题描述】:

我有一个定期添加重复值的表。一个简单的解决方法是添加一个额外的列让我检查哪些有重复项并相应地删除。我的子查询 Select 语句独立工作,但当我将其作为更新语句的一部分时却不行。我正在使用 SSMS v18.7.1 并使用最新的 SQL DB 引擎(我相信 2019 Express)。Sample Data done with a Group By Query 我知道 Update 和 Group By 并不能很好地混合,因此我认为我可以使用子查询来执行请求行动。理想情况下,我还想删除这些重复项,但还有其他变量,例如 ApptDate & ActualDelivery Columns;但是我唯一的要求是在适当的时候将 Dupchecks 设置为 Yes,然后我将在随后处理删除的逻辑。

Update a
    Set Dupcheck = 'Yes'
    from [Local DB].[dbo].[Test] a
    where (
    Select
        ID,
        count(*) as Count
        From [Local DB].[dbo].[Test]
        group by UID
        having count(*) > 1)

【问题讨论】:

  • 请提供样本数据、所需结果以及您正在使用的数据库的标签。
  • “简单的解决方法”是添加一个唯一约束,因此重复项甚至不会进入表中。
  • 添加了样本数据和当前使用的版本

标签: sql duplicates sql-update subquery


【解决方案1】:

您似乎正在使用 SQL Server。我建议使用可更新的 CTE:

with toupdate as
      select t.*, count(*) over (partition by uid) as cnt
      from [Local DB].[dbo].[Test] t
     )
update toupdate
    set Dupcheck = 'Yes'
    where cnt > 1;

注意:如果您希望所有都设置标志,则使用row_number() 而不是count(*)

【讨论】:

    【解决方案2】:

    我认为您需要使用 IN Update a Set Dupcheck = Yes from [Local DB].[dbo].[Test] a where a. ID in ( Select ID From [Local DB].[dbo].[Test] group by UID having count(*) > 1)

    【讨论】:

    • 谢谢!这行得通。在一年中的大部分时间都没有工作之后,我对 SQL 相当生疏。我非常感谢您帮助我解决的这个小问题
    【解决方案3】:

    查看您的查询,您似乎想更新所有重复项以标记为“是”。

    您可以使用以下查询将所有重复项标记为是:

    Update test t
    Set t.Dupcheck = 'Yes'
    Where exists 
      (select 1 from Test tt 
        where t.uid = tt.uid 
          And t.id <> tt.id);
    

    如果您想将除一条记录之外的所有记录标记为重复,则可以在诸如 And t.id &gt; tt.id 的存在子句中使用 &gt;&lt; 而不是 &lt;&gt;

    【讨论】:

      猜你喜欢
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-15
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      相关资源
      最近更新 更多