简体   繁体   中英

Update Query using a Subquery to mark Duplicates

I have a Table that regularly gets Duplicate values added in. A simple fix would be to just add an extra column for me to check which has duplicates and remove accordingly. My Subquery Select statement works on its own, but not when I'm placing it as part of the Update Statement. I am using SSMS v18.7.1 and utilizing the latest SQL DB engine (I believe 2019 Express). Sample Data done with a Group By Query I understand that Update & Group By don't particularly mix well hence why I thought I could use a subquery to perform the requested action. Ideally I would also like to remove these duplicates, but there are other variables such as ApptDate & ActualDelivery Columns; However my only request is to set the Dupchecks to Yes when appropriate and then I will work on the logic for the Deletions subsequently.

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)

You appear to be using SQL Server. I would suggest an updatable 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;

Note: If you want all but one of the rows to have the flag set, then use row_number() rather than count(*) .

I think you need to use 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) 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)

Looking at your query it seems like you want to update all duplicate to be marked with flag as Yes.

You can use the following query to mark all the duplicates as yes:

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

If you want to mark all except one record as duplicate then you can use > or < instead of <> in exists clause like And t.id > tt.id

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM