MERGE语句
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
MERGE
语句是最先进的标准 SQL 功能之一。 虽然它可以用于 UPSERT
语义(类似于 INSERT .. ON DUPLICATE KEY UPDATE 或 INSERT .. ON CONFLICT),但它的功能远不止这些。
标准 MERGE
语句的目的是获取一个 TARGET
表,并将来自 SOURCE
表的数据合并(INSERT
、UPDATE
或 DELETE
)到其中。
这是一个示例,假设我们有一个 BOOK_TO_BOOK_STORE_STAGING
表,我们在进行 ETL 时使用它将数据加载到“实际”的 BOOK_TO_BOOK_STORE
数据表中
-- Merge staging data into the real table MERGE INTO BOOK_TO_BOOK_STORE USING ( SELECT * FROM BOOK_TO_BOOK_STORE_STAGING ) ON BOOK_TO_BOOK_STORE.BOOK_ID = BOOK_TO_BOOK_STORE_STAGING.BOOK_ID AND BOOK_TO_BOOK_STORE.NAME = BOOK_TO_BOOK_STORE_STAGING.NAME WHEN MATCHED THEN UPDATE SET STOCK = BOOK_TO_BOOK_STORE_STAGING.STOCK WHEN NOT MATCHED THEN INSERT ( BOOK_ID, NAME, STOCK ) VALUES ( BOOK_TO_BOOK_STORE_STAGING.BOOK_ID, BOOK_TO_BOOK_STORE_STAGING.NAME, BOOK_TO_BOOK_STORE_STAGING.STOCK );
create.mergeInto(BOOK_TO_BOOK_STORE) .using(BOOK_TO_BOOK_STORE_STAGING) .on(BOOK_TO_BOOK_STORE.BOOK_ID .eq(BOOK_TO_BOOK_STORE_STAGING.BOOK_ID) .and(BOOK_TO_BOOK_STORE.NAME .eq(BOOK_TO_BOOK_STORE_STAGING.NAME))) .whenMatchedThenUpdate().set( BOOK_TO_BOOK_STORE.STOCK, BOOK_TO_BOOK_STORE_STAGING.STOCK ) .whenNotMatchedThenInsert( BOOK_TO_BOOK_STORE.BOOK_ID, BOOK_TO_BOOK_STORE.NAME, BOOK_TO_BOOK_STORE.STOCK ) .values( BOOK_TO_BOOK_STORE_STAGING.BOOK_ID, BOOK_TO_BOOK_STORE_STAGING.NAME, BOOK_TO_BOOK_STORE_STAGING.STOCK ) .execute();
将 MERGE
语句视为 TARGET
和 SOURCE
表之间的 RIGHT JOIN,其中 ON
子句定义了 TARGET
和 SOURCE
行之间是否存在 MATCH
- 如果存在
MATCH
,则可以对TARGET
行执行UPDATE
或DELETE
操作 - 如果没有
MATCH
,则SOURCE
行可用于对TARGET
表执行INSERT
操作 - 如果没有
MATCH
,某些方言还支持BY SOURCE
子句,以指定应执行 LEFT JOIN 或 FULL JOIN,以便允许对TARGET
表中没有匹配行的现有行执行UPDATE
或DELETE
操作。
以下各节详细解释了 MERGE
语句。
目录
- 3.5.7.1.
- USING .. ON
- 3.5.7.2.
- WHEN MATCHED THEN UPDATE
- 3.5.7.3.
- WHEN MATCHED THEN DELETE
- 3.5.7.4.
- WHEN MATCHED AND ..
- 3.5.7.5.
- WHEN NOT MATCHED THEN INSERT
- 3.5.7.6.
- WHEN NOT MATCHED AND .. (新增)
- 3.5.7.7.
- WHEN NOT MATCHED BY SOURCE (新增)
上一节 : 下一节 |
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的反馈!