Deleting Duplicate Rows in SQL – A Beginner’s Guide

Data duplication is a common challenge in databases. It can bloat storage, skew analysis, and lead to inaccurate results. Thankfully, SQL provides powerful tools to identify and eliminate these pesky duplicates. This tutorial will guide you through various approaches to deleting duplicate rows in SQL, emphasizing best practices for beginners.

Understanding Duplicates

Before diving into deletion, let’s define what constitutes a duplicate row. In essence, a duplicate row is a record with identical values in all columns you consider unique. For instance, in a customer table, rows with the same customer ID, name, and address would be duplicates. However, if “email” is also included, rows with the same details except for different email addresses wouldn’t be duplicates.

Identifying Duplicates

The first step is to pinpoint the duplicate rows. Here’s a basic SQL query structure that accomplishes this:


FROM your_table
GROUP BY column1, column2, ..., columnN

Replace your_table with your actual table name, and list the columns (column1, column2, etc.) that define uniqueness. This query groups rows based on the specified columns and then uses the HAVING clause to identify groups with more than one row (duplicates).

Example: Imagine a table named Products with columns product_id (primary key), name, price, and color. To find duplicates based on name and color, use the following query:


FROM Products
GROUP BY name, color

This query will return all duplicate rows where the combination of name and color appears more than once.

Deleting Duplicates: Choosing the Right Approach

There are several ways to delete duplicate rows in SQL, each with its own advantages and considerations. Let’s explore some common methods:

  1. DELETE with WHERE and JOIN:

This approach uses the DELETE statement with a WHERE clause that leverages a JOIN operation. We can identify the “keeper” row (one you want to retain) by comparing a column with an aggregation function like MIN or MAX.

Example: Here’s how to delete all duplicate rows in the Products table except for the one with the minimum product_id:


FROM Products AS p
  SELECT name, color, MIN(product_id) AS min_id
  FROM Products
  GROUP BY name, color
) AS keepers ON = AND p.color = keepers.color AND p.product_id <> keepers.min_id;

This query performs an inner join between two instances of the Products table. The subquery identifies the min_id for each combination of name and color. The main DELETE statement then removes rows from Products (aliased as p) where the product_id is not the min_id identified by the subquery.

  1. DELETE with ROW_NUMBER():

This method utilizes the ROW_NUMBER() function, which assigns a unique number to each row based on a specific ordering. We can then delete rows with a ROW_NUMBER() greater than 1.

Example: Here’s how to delete all duplicate rows in the Products table except for the one that appears first based on product_id:


WHERE ROW_NUMBER() OVER (PARTITION BY name, color ORDER BY product_id) > 1;

This query uses ROW_NUMBER() with a PARTITION BY clause to assign a number within each group defined by name and color. It then orders the rows by product_id and deletes those with a ROW_NUMBER() greater than 1 (duplicates).


This method is a quick way to remove all rows from a table, essentially resetting it. However, use it with caution, as it cannot be undone. It’s ideal for temporary tables or situations where you have a backup and want to completely eliminate duplicates.

Example: To completely remove all rows from the Products table:



Important Considerations:

  • Backup: Always create a backup of your table before deleting rows. This allows you to recover data in case of mistakes.
  • Transaction Management: Consider using transactions when deleting a large number of rows. This ensures that all deletions are committed or rolled back if an error occurs.

Leave a Comment