Oracle:合并相当于全部插入吗?

时间:2018-07-24 08:08:58

标签: oracle merge

我试图在几个论坛上找不到答案,但是运气不好,所以也许您可以帮帮我。 我有一个INSERT ALL请求,可一次插入数千行。

INSERT ALL
   INTO my_table (field_x, field_y, field_z) VALUES ('value_x1', 'value_y1', 'value_z1')
   INTO my_table (field_x, field_y, field_z) VALUES ('value_x2', 'value_y2', 'value_z2')
   ...
   INTO my_table (field_x, field_y, field_z) VALUES ('value_xn', 'value_yn', 'value_zn')
SELECT * FROM DUAL;

现在,我想对其进行修改以在满足某些条件时更新行。对于每一行,我可能会有类似的内容:

MERGE INTO my_table m
    USING (SELECT 'value_xi' x, 'value_yi' y, 'value_zi' z FROM DUAL) s
    ON (m.field_x = s.x and m.field_y = s.y)
    WHEN MATCHED THEN UPDATE SET 
        field_z = s.z,
    WHEN NOT MATCHED THE INSERT (field_x, field_y, field_z) 
        VALUE(s.x, s.y, s.z);

我是否可以进行一种“全部合并”,使所有合并请求合并在一起?

或者我可能错过了重点,还有更好的方法可以做到这一点?

谢谢

编辑:一种可能的解决方案是对双选中的一组选择使用“ UNION ALL”,如下所示:

MERGE INTO my_table m
    USING (
        select '' as x, '' as y, '' as z from dual
        union all select 'value_x1', 'value_y1', 'value_z1' from dual
        union all select 'value_x2', 'value_y2', 'value_z2' from dual
        [...]
        union all select 'value_xn', 'value_yn', 'value_zn' from dual
    ) s
    ON (m.field_x = s.x and m.field_y = s.y)
    WHEN MATCHED THEN UPDATE SET 
        field_z = s.z,
    WHEN NOT MATCHED THEN INSERT (field_x, field_y, field_z) 
        VALUES (s.x, s.y, s.z);

注意:我使用第一个空行能够在编写请求时以相同格式生成所有行。我也在那里指定列名称。

另一种解决方案是创建一个临时表,将所有数据插入其中,然后与目标表合并并删除该临时表。

1 个答案:

答案 0 :(得分:1)

如果您要从python脚本传递成千上万的行,我会这样做:

  1. 创建一个全局临时表(GTT-这是一个永久表,用于保存会话级的数据)
  2. 获取您的python脚本以将行插入到GTT中
  3. 在Merge语句中使用GTT,例如:

merge into your_main_table tgt
  using your_gtt src
    on (<join conditions>)
when matched then
  update ...
when not matched then
  insert ...;