Solved

Problem deleting duplicates using a CTE when there are table joins

Posted on 2010-11-10
10
1,245 Views
Last Modified: 2012-05-10
I've used CTEs to remove duplicates successfully before, but this time round I wanted to delete them from one table having joined to other tables and it comes back with the error:

View or function 'dupnotesCTE' is not updatable because the modification affects multiple base tables. See the attached code for my sql statement.

Not sure where I've gone wrong here...can someone help please?
;WITH dupnotesCTE([FileNo]
      ,[CommentDate]
      ,[CommentTime]
      ,[CommentUser]
      ,[Cat]
      ,[Pri]
      ,[Line]
      ,[Note], Ranking)
AS
(
SELECT	p.[FileNo]
      ,p.[CommentDate]
      ,p.[CommentTime]
      ,p.[CommentUser]
      ,p.[Cat]
      ,p.[Pri]
      ,p.[Line]
      ,p.[Note]
	,Ranking = row_number() OVER(PARTITION BY p.[FileNo]
      ,p.[CommentDate]
      ,p.[CommentTime]
      ,p.[CommentUser]
      ,p.[Cat]
      ,p.[Pri]
      ,p.[Line]
      ,p.[Note] ORDER BY p.[FileNo]
      ,p.[CommentDate]
      ,p.[CommentTime]
      ,p.[CommentUser]
      ,p.[Cat]
      ,p.[Pri]
      ,p.[Line]
      ,p.[Note])
FROM filenotes p
join detailtable d on ltrim(rtrim(p.FileNo)) = ltrim(rtrim(d.FileNo))
join country c on d.country_no = c.country_no
where c.continent in ('Asia','Europe')
)

delete from dupnotesCTE
where ranking > 1

Open in new window

0
Comment
Question by:Grffster
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 5
10 Comments
 
LVL 32

Expert Comment

by:Erick37
ID: 34101354


...

delete p
FROM filenotes p
JOIN dupnotesCTE c ON c.FileNo = p.fileNo --??
where c.ranking > 1
0
 

Author Comment

by:Grffster
ID: 34101830
This won't work though will it as, say you have a pair of duplicates A and B. You have A in dupnotesCTE with rank 1, and B in dupnotesCTE with rank 2. When you link from filenotes to dupnotes you'll have 4 records:

filenotes.A and dupnotes.A (rank 1)
filenotes.A and dupnotes.B (rank 2)
filenotes.B and dupnotes.A (rank 1)
filenotes.B and dupnotes.B (rank 2)

Your "where c.ranking > 1" will remove the 2nd and 4th combinations but you're left with two records i.e. combinations 1 and 3 above.

May be mistaken, but my query seems to reflect this.
0
 
LVL 32

Expert Comment

by:Erick37
ID: 34102171
Does filenotes table have an identity column or primary key that you could use to join the cte?

0
NEW Veeam Agent for Microsoft Windows

Backup and recover physical and cloud-based servers and workstations, as well as endpoint devices that belong to remote users. Avoid downtime and data loss quickly and easily for Windows-based physical or public cloud-based workloads!

 

Author Comment

by:Grffster
ID: 34102188
No it doesn't sorry.
0
 
LVL 32

Expert Comment

by:Erick37
ID: 34102227
So all of the columns with the duplicate FileNo are also duplicate?
0
 

Author Comment

by:Grffster
ID: 34102264
Yes, all the fields per fileno duplicate are identical i.e. a true duplicated record with the same data in each column:

[FileNo],[CommentDate],[CommentTime],[CommentUser],[Cat],[Pri],[Line],[Note]
0
 
LVL 32

Expert Comment

by:Erick37
ID: 34102504
Having an identity column would greatly simplify identifying the duplicates.

One possibility would be to copy the records over to a temp table with an identity column.
Remove the duplicates from the temp table.
Delete all the records from the user table that you originally copied to the temp table.
Insert the cleaned records back into filenotes table.

Here are some other alternatives:
"How to delete duplicate records or rows among identical rows in a table where no primary key exists"
http://www.kodyaz.com/articles/delete-duplicate-records-rows-in-a-table.aspx
0
 

Author Comment

by:Grffster
ID: 34102929
I've added an identity column to the filenotes table now. How should it look now? Do I do something like at the bottom of your last link in method 3?
0
 
LVL 32

Accepted Solution

by:
Erick37 earned 500 total points
ID: 34103157
You will add the identity column to the CTE and use that to join the table to the cte.

;WITH dupnotesCTE AS
(
  SELECT
      IdentityColumn
      ,[FileNo]
      ...
      ,row_number() OVER(PARTITION BY p.[FileNo] order by IdentityColumn) AS Ranking
     ...

)
delete p
FROM filenotes p
JOIN dupnotesCTE c ON c.IdentityColumn = p.IdentityColumn AND c.ranking > 1
0
 

Author Closing Comment

by:Grffster
ID: 34103515
That's worked a dream thanks Eric.
0

Featured Post

Free learning courses: Active Directory Deep Dive

Get a firm grasp on your IT environment when you learn Active Directory best practices with Veeam! Watch all, or choose any amount, of this three-part webinar series to improve your skills. From the basics to virtualization and backup, we got you covered.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

by Mark Wills PIVOT is a great facility and solves many an EAV (Entity - Attribute - Value) type transformation where we need the information held as data within a column to become columns in their own right. Now, in some cases that is relatively…
This article explains how to reset the password of the sa account on a Microsoft SQL Server.  The steps in this article work in SQL 2005, 2008, 2008 R2, 2012, 2014 and 2016.
In this video we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…

615 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question