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 (新增)
| 上一节 : 下一节 |
反馈
您对此页面有任何反馈吗? 我们很乐意听到您的反馈!