我试图在几个论坛上找不到答案,但是运气不好,所以也许您可以帮帮我。 我有一个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);
注意:我使用第一个空行能够在编写请求时以相同格式生成所有行。我也在那里指定列名称。
另一种解决方案是创建一个临时表,将所有数据插入其中,然后与目标表合并并删除该临时表。
答案 0 :(得分:1)
如果您要从python脚本传递成千上万的行,我会这样做:
merge into your_main_table tgt
using your_gtt src
on (<join conditions>)
when matched then
update ...
when not matched then
insert ...;