我正在改进Oracle中现有ETL层的一部分。从多个来源有效更新表格
- 将文件加载到临时表中。
- 执行许多MERGE语句来解析代理键。
- 应用了其他一些业务逻辑(需要这些代理键)。
- 结果合并 在表中(同时与代理键和业务逻辑 结果)
这是第2步,我想提高,似乎比理想少做到这一点作为几个步骤。
MERGE INTO temp t
USING dimension_1 d1 ON (d1.natural_key = t.d1_natural_key)
WHEN MATCHED THEN UPDATE t.d1_id = d1.id
MERGE INTO temp t
USING dimension_2 d2 ON (d2.natural_key = t.d2_natural_key)
WHEN MATCHED THEN UPDATE t.d2_id = d2.id
MERGE INTO temp t
USING dimension_3 d3 ON (d3.natural_key = t.d3_natural_key)
WHEN MATCHED THEN UPDATE t.d3_id = d3.id
如果我在SQL Server写这个我会做类似如下:
UPDATE
t
SET
d1_id = COALESCE(d1.id, -1),
d2_id = COALESCE(d2.id, -1),
d3_id = COALESCE(d3.id, -1)
FROM
temp t
LEFT JOIN
dimension_1 d1
ON d1.natural_key = t.d1_natural_key
LEFT JOIN
dimension_2 d2
ON d2.natural_key = t.d2_natural_key
LEFT JOIN
dimension_3 d3
ON d3.natural_key = t.d3_natural_key
对我的生活中,我找不到什么似乎像Oracle中的明智的选择。我已经能够解决的最好的办法是使用更新(而我周围的每个人都在尖叫我必须使用MERGE)和相关的子查询;像...
UPDATE
temp t
SET
d1_id = COALESCE((SELECT id FROM dimension_1 d1 WHERE d1.natural_key = t.d1_natural_key), -1),
d2_id = COALESCE((SELECT id FROM dimension_2 d2 WHERE d2.natural_key = t.d2_natural_key), -1),
d3_id = COALESCE((SELECT id FROM dimension_3 d3 WHERE d3.natural_key = t.d3_natural_key), -1)
有没有更好的选择?或者是在Oracle中实际执行的相关子查询方法?
你为什么拒绝Oracle的左连接方法?语法会略有不同,但这个想法会起作用。 –
@AlexPoole - 因为我没有解释'SET(x,y,z)=(SELECT x,y,z FROM blah)'语法来使'UPDATE'工作,并且因为使'MERGE'工作需要表更新以加入自身。 – MatBailie