我希望使用PL / SQL的MERGE语句在我的维度表中实现一种类型2慢变维度行为。它适用于更新现有值和插入新值。我希望通过不仅更新现有值,而是使用更新的值创建不同的行来扩展此功能,同时保留带有"过时的行#34;值。
简而言之,是否可以这样做?
MERGE INTO A
USING B
ON (A.ID = B.ID)
WHEN MATCHED THEN
UPDATE END_DATE ON THE EXISTING ROW;
INSERT UPDATED VALUES IN A NEW ROW;
WHEN NOT MATCHED THEN
INSERT A NEW ROW WITH NEW VALUES;
提前谢谢你们。
答案 0 :(得分:0)
你需要在这里运行两个语句而不是一个语句。
(在你的伪代码中)
UPDATE END_DATE IN A WHERE A.ID = something_from_B
INSERT new VALUES IN A
无论如何,插入都需要发生。因此无需检查行是否存在(并且仅在行存在时才更新)。只需end_date匹配B的所有记录。这将end_date 0到n行数。然后将所有内容放在一起,而不必担心该记录是否已经过时。
如果您想要事务原子性,请将其放在BEGIN...END;
内。
答案 1 :(得分:0)
总之 - 没有。如果找不到匹配的数据,MERGE语句提供INSERT选项,如果找到匹配的数据,则提供UPDATE选项。它不提供" update-and-insert"如果找到匹配的数据。
祝你好运。
答案 2 :(得分:0)
据我所知,你写了一个伪代码。所以我也可以在伪代码中提出一个想法:
MERGE INTO A
USING (select * from B1 union all
select * from B2) B
ON (A.ID = B.ID)
WHEN MATCHED THEN
UPDATE END_DATE ON THE EXISTING ROW FROM B1;
WHEN NOT MATCHED THEN
INSERT A NEW ROW WITH NEW VALUES FROM B2;
如果要将更新的行插入为新的,可以基于B
生成子查询,该子查询将包含“更新的行”,但这些行必须被SQL引擎视为新的(不可能说没有关于你的桌子的细节怎么做)。在我的查询B1
中是“要更新的行”,而B2
是“必须看起来像新的更新行”。如果这样做,将插入更新的行
此外,无法保证在您的情况下可以实施。
答案 3 :(得分:0)
如果你真的在做一个Type 2维度并希望使用合并,是的,它可以完成,但它并不是非常简单。实际上,如果您需要使用USING子句中的内联视图来比较您的数据,那么它将包含一个列,用于指示其是插入还是更新。此字段将连接到缓慢变化的维度表,该表驱动是否发生插入或更新。
这篇博文非常详细地介绍了这项技术并且对我们有用,虽然我们使用哈希来确定不一致而不是逐列比较。
Load Slowly Changing Dimension Type 2 using Oracle Merge Statement