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 ProductIDs. 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
UPDATEoperations. - Use Transactions: Wrap your
UPDATEstatements 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
SELECTstatement with the sameJOINandWHEREconditions to preview which rows will be affected and what the new values will be. - Index Columns: Ensure that the columns used in the
JOINconditions (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 JOINandIS NULLchecks, or aMERGEstatement (if supported). - Performance Considerations: For very large tables, consider breaking down the
UPDATEinto 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.