如何区分转换中的插入和更新

Posted

技术标签:

【中文标题】如何区分转换中的插入和更新【英文标题】:How to differentiate between insert and update in transformation 【发布时间】:2018-07-10 20:05:47 【问题描述】:

我在包含这些列的数据库中有这张表

学生

student_id INT

student_name VARCHAR

class_name VARCHAR

我想把表变成两张表

student_transformed

student_key 

student_id 

student_name

类转换

class_key       

class_name

我的问题是类表的转换:

插入新记录:

select * 
  from student  s
  left
  join class_transformed  c
    on s.class_name = c.class_name

但是如果学生表中的 class_name 得到更新,它将是一个新的行记录。换句话说,无法区分插入和更新。

我的问题是,如何进行转换并使插入和更新工作?请注意,我们没有 class_id。

【问题讨论】:

您对渐变维度的熟悉程度如何? @Error_2646,我对scd很熟悉,这里的问题是我没有类的ID,并且名称可以更改,因此会导致更新和插入出现问题。 我明白你在说什么。抱歉 - 仅凭您提供的数据无法做您想做的事。根本没有足够的信息。如果这是一个现实世界的问题,您需要在数据流中进入上游并获取一些持久的类标识符。也许如果班级名称可以更改,但您希望与班级相关的所有学生保持不变,您可以进行一些丑陋的覆盖,但这是牵强的。 【参考方案1】:

我认为您需要另一张桌子,例如:

Student_to_Class

Student_key

Class_key

这样就可以了

select * 
  from student  s
left join Student_to_Class s2c
on s.student_key = s2c.student_key
  left join class_transformed  c
    on s2c.class_key= c.class_key

【讨论】:

我认为这个问题比联结表更棘手。在不知道数据的确切性质的情况下很难判断,但从他的描述来看,问题似乎是这样的——假设你想加载一个“Person”表。在一个完美的世界里,你会有 id, name 这样 Day1: 1, Jane Doe 是一个插入 Day2: 2, John Deer 是一个插入 Day3 1, Jane Deer (他们结婚了)是更新。如果没有 id,就不可能知道 Jane Deer 是一个新人,还是一个改名的现有人。我假设这对他的数据至关重要。

以上是关于如何区分转换中的插入和更新的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL Upsert 使用系统列 XMIN、XMAX 等来区分插入和更新的行

MaxCompute数据仓库在更新插入直接加载全量历史表三大算法中的数据转换实践

Java上的MySQL“INSERT ... ON DUPLICATE KEY UPDATE”:如何区分插入/更新/无变化状态

kettle庖丁解牛第25篇之插入更新

如何区分 Perl 中的数字标量和字符串标量?

如何区分 Perl 中的数字标量和字符串标量?