SQL Update from One Table to Another Based on a ID Match
Efficiently Update SQL Tables Using Joins and ID Matching

Learn how to update data in one SQL table based on matching IDs from another table, covering various SQL dialects and best practices for data integrity.
Updating data in a SQL table often requires referencing values from another table. This is a common scenario in database management, such as synchronizing data, applying business rules, or correcting discrepancies. This article explores different methods to perform an UPDATE
statement using data from a SELECT
statement or another table, specifically when matching records based on an ID.
Understanding the Core Problem
Imagine you have two tables: Products
and ProductStaging
. The ProductStaging
table contains updated prices for existing products, identified by a ProductID
. Your goal is to update the Price
column in the Products
table using the NewPrice
from ProductStaging
for all matching ProductID
s. This operation requires joining the two tables on the ProductID
and then applying the update.
erDiagram PRODUCTS ||--o{ PRODUCT_STAGING : "has updated price in" PRODUCTS { int ProductID PK varchar ProductName decimal Price datetime LastUpdated } PRODUCT_STAGING { int ProductID PK decimal NewPrice datetime StagingDate }
Entity-Relationship Diagram for Products and ProductStaging tables
SQL Server Approach: UPDATE with JOIN
SQL Server provides a straightforward syntax for updating a table by joining it with another. This method is highly readable and efficient for matching records. The FROM
clause is used to specify the tables involved in the join, and the ON
clause defines the join condition.
UPDATE P
SET P.Price = PS.NewPrice,
P.LastUpdated = GETDATE()
FROM Products AS P
INNER JOIN ProductStaging AS PS
ON P.ProductID = PS.ProductID;
SQL Server UPDATE statement using INNER JOIN
UPDATE
statements involving joins. This improves readability and reduces ambiguity, especially when column names might be identical across tables.MySQL Approach: Multi-Table UPDATE
MySQL supports a multi-table UPDATE
syntax that allows you to specify multiple tables in the UPDATE
clause, followed by JOIN
conditions. This is similar in concept to SQL Server but with a slightly different syntax.
UPDATE Products AS P
INNER JOIN ProductStaging AS PS
ON P.ProductID = PS.ProductID
SET P.Price = PS.NewPrice,
P.LastUpdated = NOW();
MySQL UPDATE statement using INNER JOIN
PostgreSQL/Oracle Approach: UPDATE with FROM/USING
PostgreSQL and Oracle (using a subquery or MERGE
) handle updates from other tables differently. PostgreSQL uses a FROM
clause directly within the UPDATE
statement, while Oracle often relies on correlated subqueries or the MERGE
statement for more complex scenarios.
-- PostgreSQL
UPDATE Products AS P
SET Price = PS.NewPrice,
LastUpdated = NOW()
FROM ProductStaging AS PS
WHERE P.ProductID = PS.ProductID;
-- Oracle (using correlated subquery)
UPDATE Products P
SET (Price, LastUpdated) = (
SELECT PS.NewPrice, SYSDATE
FROM ProductStaging PS
WHERE PS.ProductID = P.ProductID
)
WHERE EXISTS (
SELECT 1
FROM ProductStaging PS
WHERE PS.ProductID = P.ProductID
);
PostgreSQL and Oracle UPDATE statements
UPDATE
statement on production data, it is crucial to test it on a development or staging environment. Always wrap your UPDATE
statements in a TRANSACTION
and use SELECT
statements with the same JOIN
conditions to verify the affected rows before committing.Best Practices for Updating from Another Table
When performing updates based on data from another table, consider the following best practices to ensure data integrity and performance:
- Backup Your Data: Always back up your database or the affected tables before executing significant
UPDATE
operations. - Use Transactions: Wrap your
UPDATE
statements in a transaction (BEGIN TRANSACTION
/COMMIT
/ROLLBACK
) to allow for easy rollback in case of errors. - Verify Affected Rows: Before committing a transaction, use a
SELECT
statement with the sameJOIN
andWHERE
conditions to preview which rows will be affected and what the new values will be. - Index Columns: Ensure that the columns used in the
JOIN
conditions (e.g.,ProductID
) are indexed. This significantly improves query performance. - Handle Non-Matches: Consider what should happen to records in the target table that do not have a match in the source table. If you need to update based on non-matches, you might need
LEFT JOIN
andIS NULL
checks, or aMERGE
statement (if supported). - Performance Considerations: For very large tables, consider breaking down the
UPDATE
into smaller batches to avoid locking issues and reduce transaction log size.
1. Step 1: Identify Source and Target Tables
Clearly define which table contains the data to be updated (target) and which table contains the new values (source). Identify the common column(s) for matching records, typically a primary key or unique identifier.
2. Step 2: Construct the JOIN Condition
Write the JOIN
clause that links the target and source tables based on the common ID. An INNER JOIN
is usually appropriate when you only want to update records that exist in both tables.
3. Step 3: Define the SET Clause
Specify which columns in the target table need to be updated and map them to the corresponding columns from the source table. Include any additional updates like LastUpdated
timestamps.
4. Step 4: Test in a Transaction
Execute the UPDATE
statement within a BEGIN TRANSACTION
block. Immediately follow with a SELECT
statement to verify the changes. If satisfied, COMMIT
the transaction; otherwise, ROLLBACK
.