问题描述
这是下面的要求,有两个表T1_D1
和T2_D2
。其中T1_D1
strong> 有 4 条记录,T2_D2
有 6 条记录,其中有插入、更新。
现在,我需要比较这两个表并更新表T1_D1
上的所有修改。
示例数据:T1_D1
ID | TRANSACTION_DATE | 产品 | 价格 | IS_UPDATED |
---|---|---|---|---|
1 | 01/02/2009 13:08 | Product1 | 350 | N |
2 | 01/02/2009 12:56 | Product2 | 1300 | N |
3 | 01/02/2009 14:58 | Product2 | 1250 | N |
4 | 01/02/2009 18:48 | Product1 | 1450 | N |
示例数据:T1_D2
ID | TRANSACTION_DATE | 产品 | 价格 |
---|---|---|---|
1 | 01/02/2009 13:08 | Product1 | 350 |
3 | 01/02/2009 14:58 | Product2 | 1250 |
4 | 01/02/2009 18:48 | Product1 | 1450 |
5 | 01/02/2009 20:09 | Product1 | 1200 |
6 | 01/02/2009 15:56 | Product5 | 1300 |
3 | 01/02/2009 14:58 | Product2 | 1350 |
最终结果:
ID | TRANSACTION_DATE | 产品 | 价格 | IS_UPDATED |
---|---|---|---|---|
1 | 01/02/2009 13:08 | Product1 | 350 | N |
2 | 01/02/2009 12:56 | Product2 | 1300 | N |
3 | 01/02/2009 14:58 | Product2 | 1250 | Y |
4 | 01/02/2009 18:48 | Product1 | 1450 | N |
5 | 01/02/2009 20:09 | Product1 | 1200 | N |
6 | 01/02/2009 15:56 | Product5 | 1300 | N |
3 | 01/02/2009 14:58 | Product2 | 1350 | N |
解决方法
建议的解决方案:
- 首先找到 T2_D2 - T1_D1 => 这给了我们增量,即插入和更新,并将它们附加到 t1_d1。 在这种情况下,附加在插入的意义上。
上述查询的实际结果集:
ID | TRANSACTION_DATE | 产品 | 价格 |
---|---|---|---|
5 | 01/02/2009 20:09 | Product1 | 1200 |
6 | 01/02/2009 15:56 | Product5 | 1300 |
3 | 01/02/2009 14:58 | Product2 | 1350 |
- 插入后的表格如下所示。
ID | TRANSACTION_DATE | 产品 | 价格 | IS_UPDATED |
---|---|---|---|---|
1 | 01/02/2009 13:08 | Product1 | 350 | N |
2 | 01/02/2009 12:56 | Product2 | 1300 | N |
3 | 01/02/2009 14:58 | Product2 | 1250 | N |
4 | 01/02/2009 18:48 | Product1 | 1450 | N |
5 | 01/02/2009 20:09 | Product1 | 1200 | N |
6 | 01/02/2009 15:56 | Product5 | 1300 | N |
3 | 01/02/2009 14:58 | Product2 | 1350 | N |
- 根据这个表,唯一值永远不会改变即 ID,PRODUCT 永远不会改变,而是所有其他值都会改变,所以我维护了一个名为 config_pull 的表具有以下架构。
ID | TABLE_NAME | COLS |
---|---|---|
1 | T1_D1 | ID,PRODUCT |
- 现在我已经编写了一个过程,它获取config_pull 的结果集并动态地为上述要求生成一个查询。 即查询看起来像
SELECT T.ID,T.TRANSACTION_DATE,T.PRODUCT FROM T1_D1 as T,(SELECT ID,TRANSACTION_DATE,PRODUCT from T1_D2 EXCEPT SELECT ID,PRODUCT FROM T1_D1) as M WHERE M.ID = T.ID
- 上述查询给出了第 1 天的实际更新行。
ID | TRANSACTION_DATE | 产品 | 价格 |
---|---|---|---|
3 | 01/02/2009 14:58 | Product2 | 1250 |
- 稍后在 T1_D1 中编写一条更新语句来更新从上述查询中获取的所有行,即
ID | TRANSACTION_DATE | 产品 | 价格 | IS_UPDATED |
---|---|---|---|---|
3 | 01/02/2009 14:58 | Product2 | 1250 | Y |
最终结果
ID | TRANSACTION_DATE | 产品 | 价格 | IS_UPDATED |
---|---|---|---|---|
1 | 01/02/2009 13:08 | Product1 | 350 | N |
2 | 01/02/2009 12:56 | Product2 | 1300 | N |
3 | 01/02/2009 14:58 | Product2 | 1250 | Y |
4 | 01/02/2009 18:48 | Product1 | 1450 | N |
5 | 01/02/2009 20:09 | Product1 | 1200 | N |
6 | 01/02/2009 15:56 | Product5 | 1300 | N |
3 | 01/02/2009 14:58 | Product2 | 1350 | N |
- 现在,如果您想在 100 个表或 200 个表上运行此操作,首先将所有需要的关键列存储在一个表中并为其编写一个过程,以便在无需人工干预的情况下动态执行更新和所有操作。
如果您找到任何其他方法以不同的方式解决此问题,而不使用独特的列方法,请告诉我。
,由于您使用的是 Snowflake,另一种方法是使用他们的“表流”方法来“更改数据捕获”。
,查看 MERGE
语句:
可以一步更新、插入、删除:
merge into target_table using source_table
on target_table.id = source_table.id
when matched then
update set target_table.description = source_table.description
when not matched then
insert (id,description) values (source_table.id,source_table.description);
看你的问题似乎是:
-
target_table
是T1_D1
-
source_table
是T2_D2
-
on target_table.id = source_table.id
是T1_D1.transaction_date=T2_D2.transaction_date and T1_D1.product=T2_D2.product
- 更新会改变价格,将
target_table.description = source_table.description
更改为T1_D1.price = T2_D2.price
- 应更改插入以匹配 T1_D1 中的插入。