ETL - 使用潜在的新记录或更新的记录更新表
ETL - Update Tables with potentially new records or updated records
我正在尝试通过插入 etl 进程来完成以下 table 更新:
- 添加一条不存在的新记录
- 更新任何有更新的记录
- 保留所有未更改的记录
在 table 上,我有一个 unique_id 和一个 updated_date 记录更新时的字段(或者可以作为记录首次创建的日期)。下面是两个 tables 的示例代码和第三个我希望输出在插入语句之后:
BEGIN TRANSACTION;
/* Create a table called NAMES */
CREATE TABLE NAMES(Id integer PRIMARY KEY, Name text, updated_date DATE);
CREATE TABLE NEW_NAMES(Id integer PRIMARY KEY, Name text, updated_date DATE);
CREATE TABLE FINAL_TABLE_DESIRED(Id integer PRIMARY KEY, Name text, updated_date DATE);
/* Create few records in this table */
INSERT INTO NAMES VALUES(1,'Tom', '2021-08-09');
INSERT INTO NAMES VALUES(2,'Lucy', '2021-08-07');
INSERT INTO NAMES VALUES(3,'Frank', '2021-08-07');
INSERT INTO NAMES VALUES(4,'Jane', '2021-08-07');
INSERT INTO NAMES VALUES(5,'Robert', '2021-08-07');
INSERT INTO NEW_NAMES VALUES(1,'Tom John', '2021-08-17');
INSERT INTO NEW_NAMES VALUES(70,'Lollah', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(2,'Lucy', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(3,'Frank', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(4,'Jane', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(5,'Robert', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(1,'Tom John', '2021-08-17');
INSERT INTO FINAL_TABLE_DESIRED VALUES(70,'Lollah', '2021-08-17');
COMMIT;
/* Display all the records from the table */
SELECT * FROM final_table_desired;
是否有比上述方法更好的方法,即 scd2 - 如果是,为什么?
试试这个:
- 创建 table FINAL_TABLE_DESIRED 作为 NAMES
的克隆
- 写一个 MERGE INTO 语句,以 FINAL_TABLE_DESIRED 作为目标,NEW_NAMES 作为源
您可以使用 MERGE 语句来完成此操作
MERGE INTO NAMES
USING NEW_NAMES
ON NEW_NAMES.ID = NAMES.ID
WHEN MATCHED THEN UPDATE SET NAMES.NAME = NEW_NAMES.NAME, UPDATED_DATE = CURRENT_DATE()
WHEN NOT MATCHED THEN INSERT (ID, NAME, UPDATED_DATE) VALUES (NEW_NAMES.ID, NEW_NAMES.NAME, CURRENT_DATE());
我正在尝试通过插入 etl 进程来完成以下 table 更新:
- 添加一条不存在的新记录
- 更新任何有更新的记录
- 保留所有未更改的记录
在 table 上,我有一个 unique_id 和一个 updated_date 记录更新时的字段(或者可以作为记录首次创建的日期)。下面是两个 tables 的示例代码和第三个我希望输出在插入语句之后:
BEGIN TRANSACTION;
/* Create a table called NAMES */
CREATE TABLE NAMES(Id integer PRIMARY KEY, Name text, updated_date DATE);
CREATE TABLE NEW_NAMES(Id integer PRIMARY KEY, Name text, updated_date DATE);
CREATE TABLE FINAL_TABLE_DESIRED(Id integer PRIMARY KEY, Name text, updated_date DATE);
/* Create few records in this table */
INSERT INTO NAMES VALUES(1,'Tom', '2021-08-09');
INSERT INTO NAMES VALUES(2,'Lucy', '2021-08-07');
INSERT INTO NAMES VALUES(3,'Frank', '2021-08-07');
INSERT INTO NAMES VALUES(4,'Jane', '2021-08-07');
INSERT INTO NAMES VALUES(5,'Robert', '2021-08-07');
INSERT INTO NEW_NAMES VALUES(1,'Tom John', '2021-08-17');
INSERT INTO NEW_NAMES VALUES(70,'Lollah', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(2,'Lucy', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(3,'Frank', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(4,'Jane', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(5,'Robert', '2021-08-07');
INSERT INTO FINAL_TABLE_DESIRED VALUES(1,'Tom John', '2021-08-17');
INSERT INTO FINAL_TABLE_DESIRED VALUES(70,'Lollah', '2021-08-17');
COMMIT;
/* Display all the records from the table */
SELECT * FROM final_table_desired;
是否有比上述方法更好的方法,即 scd2 - 如果是,为什么?
试试这个:
- 创建 table FINAL_TABLE_DESIRED 作为 NAMES 的克隆
- 写一个 MERGE INTO 语句,以 FINAL_TABLE_DESIRED 作为目标,NEW_NAMES 作为源
您可以使用 MERGE 语句来完成此操作
MERGE INTO NAMES
USING NEW_NAMES
ON NEW_NAMES.ID = NAMES.ID
WHEN MATCHED THEN UPDATE SET NAMES.NAME = NEW_NAMES.NAME, UPDATED_DATE = CURRENT_DATE()
WHEN NOT MATCHED THEN INSERT (ID, NAME, UPDATED_DATE) VALUES (NEW_NAMES.ID, NEW_NAMES.NAME, CURRENT_DATE());