Sql 插入或更新表

Sql 插入或更新表,sql,oracle,syntax,sql-merge,Sql,Oracle,Syntax,Sql Merge,我在一个文件中有一个100k ID的列表。我想遍历这些ID: 对于每个id,检查id是否在表中: 如果是,则更新其updated_date标志 如果没有,请添加新记录(id,更新日期) 我已经研究并发现了MERGE子句。缺点是,MERGE要求ID位于表中。我只允许在必要时创建临时表 有人能给我指出正确的方向吗?它必须是一个脚本,我可以在我的数据库上运行,而不是在代码中 merge into MyTable x using ('111', '222', all my ids) b on (

我在一个文件中有一个100k ID的列表。我想遍历这些ID:

对于每个
id
,检查
id
是否在表中:

  • 如果是,则更新其
    updated_date
    标志
  • 如果没有,请添加新记录
    (id,更新日期)
我已经研究并发现了
MERGE
子句。缺点是,
MERGE
要求ID位于表中。我只允许在必要时创建临时表

有人能给我指出正确的方向吗?它必须是一个脚本,我可以在我的数据库上运行,而不是在代码中

merge into MyTable x
using ('111', '222', all my ids) b
  on (x.id = b.id)
when not matched then 
  insert (id, updated_date) values (b.id, sysdate)
when matched then
  update set x.updated_date = sysdate;

编辑:如果临时表是我唯一的选择,我现在可以使用它。

鉴于您说您不能创建临时表,一种方法可能是将您的ID列表转换为一组联合所有选择,例如:

123,
234,
...
999
变成

select 123 id from dual union all
select 234 id from dual union all
...
select 999 id from dual
然后,您可以在合并语句中使用它:

merge into MyTable x
using (select 123 id from dual union all
       select 234 id from dual union all
       ...
       select 999 id from dual) b
on (x.id = b.id)
when not matched then insert (id, updated_date) values (b.id, sysdate)
when matched then update set x.updated_date = sysdate;
但是,如果您确实拥有10万个ID,则可能需要一段时间来解析该语句!您可能希望拆分查询并使用多个合并语句


另一个想法-是否存在可以“借用”来存储数据的现有GTT?

如果您可以从Oracle服务器访问该文件,则可以定义一个外部表,允许您使用SQL从该文件中读取数据

语法是基于SQL*Loader的,它可能不是你想要做的临时工作,更像是一个重复的任务

或者,您可以使用SQL*Loader本身将其加载到表中,甚至可以使用Microsoft Access或类似数据库中的ODBC

另一个选项是运行100000个插入。您可以通过每100个左右的插入并将它们包装在匿名块中,从而将往返保存到数据库中,从而使其执行得更好,而不是:

insert into tmp values(1);
insert into tmp values(12);
insert into tmp values(145);
insert into tmp values(234);
insert into tmp values(245);
insert into tmp values(345);
....
insert into tmp values(112425);
使用

begin
  insert into tmp values(1);
  insert into tmp values(12);
  insert into tmp values(145);
  insert into tmp values(234);
  ...
  insert into tmp values(245);
end;
/
begin
  insert into tmp values(345);
  ...
  insert into tmp values(112425);
end;
/

如果这是一项常规任务,我肯定会选择一个外部表。

Hi使用该100k id文件创建一个外部表。然后在merge语句的using子句中查询该外部表,并将其与mytable id进行比较。工作。我编写脚本,将其发送给DBA,然后由DBA运行。