How do you use the MERGE statement to synchronize two tables?
Posted by BobHarris
Last Updated: July 07, 2024
The MERGE statement in SQL is used to synchronize two tables by performing INSERT, UPDATE, or DELETE operations based on the differences between the source and target tables. The MERGE statement allows for conditional logic that decides whether to update an existing row, insert a new row, or delete a row. Here is a general outline of how to use the MERGE statement:
Syntax
MERGE INTO target_table AS t
USING source_table AS s
ON t.matching_column = s.matching_column
WHEN MATCHED THEN
    UPDATE SET t.column1 = s.column1,
               t.column2 = s.column2,
               ...
WHEN NOT MATCHED THEN
    INSERT (column1, column2, ...)
    VALUES (s.column1, s.column2, ...)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;
Steps to Synchronize Two Tables
1. Identify the Target and Source Tables: Decide which table is the target (the one you want to update) and which is the source (the one with the new data). 2. Specify the Matching Condition: Determine the columns that will act as the criteria for matching records between the two tables. 3. Determine Actions: - WHEN MATCHED: Define the update operations to execute for records that exist in both tables. - WHEN NOT MATCHED: Define the insert operations to perform for records present in the source but not in the target. - WHEN NOT MATCHED BY SOURCE: Optional, but allows deletion of records from the target if they don't exist in the source.
Example
Let's assume you have two tables: employees_target (the target table) and employees_source (the source table). You want to synchronize them based on the employee_id:
MERGE INTO employees_target AS target
USING employees_source AS source
ON target.employee_id = source.employee_id
WHEN MATCHED THEN
    UPDATE SET target.first_name = source.first_name,
               target.last_name = source.last_name,
               target.salary = source.salary
WHEN NOT MATCHED THEN
    INSERT (employee_id, first_name, last_name, salary)
    VALUES (source.employee_id, source.first_name, source.last_name, source.salary)
WHEN NOT MATCHED BY SOURCE THEN
    DELETE;
Explanation of the Example
- Updating Existing Rows: If an employee_id from employees_source matches one in employees_target, the corresponding fields (first_name, last_name, and salary) are updated. - Inserting New Rows: If an employee_id exists in employees_source but not in employees_target, a new row is inserted. - Deleting Rows: If an employee_id exists in employees_target but not in employees_source, that row is deleted.
Important Considerations
- Transactions: The MERGE statement is often run within a transaction to ensure data integrity. - Performance: Depending on the size of the tables and indexing, performance may vary. Analyzing execution plans could help optimize the process. - Database Support: Not all databases support the MERGE statement. It's important to check the documentation for the specific RDBMS you are using (e.g., SQL Server, Oracle, PostgreSQL, etc.). By using a MERGE statement, you can effectively synchronize two tables with minimal code and maintain data consistency.