-- Sync a staging table into the live products table
MERGE INTO products AS p
USING (SELECT sku, name, price FROM products_staging) AS s
ON p.sku = s.sku
WHEN MATCHED AND (p.name, p.price) IS DISTINCT FROM (s.name, s.price) THEN
UPDATE SET name = s.name, price = s.price, updated_at = NOW()
WHEN NOT MATCHED THEN
INSERT (sku, name, price) VALUES (s.sku, s.name, s.price)
WHEN NOT MATCHED BY SOURCE THEN -- SQL Server / Oracle syntax
DELETE;
-- PostgreSQL 15+ syntax is slightly simpler:
MERGE INTO products p
USING products_staging s ON p.sku = s.sku
WHEN MATCHED THEN UPDATE SET name = s.name, price = s.price
WHEN NOT MATCHED THEN INSERT (sku, name, price) VALUES (s.sku, s.name, s.price);
-- Tip: for "just upsert", ON CONFLICT (Postgres) or ON DUPLICATE KEY (MySQL)
-- is usually cleaner. MERGE shines when you need DELETE in the mix too.
Create a free account and build your private vault. Share publicly whenever you want.