从SAS中的另一个表更新oracle表

时间:2014-08-01 13:12:36

标签: sql oracle sas

我在Oracle中有一个1000万行表,我是从SAS插入的。每周这个表都在SAS中更新,其中包含一些新行,并根据日期,位置等特定条件对某些行进行了一些更改。我知道如何在SAS中将表附加到oracle中。 这是我目前使用的代码。

libname ABC oracle user='aaa' password='ppp' path = xyz;
proc append base=table_10m
 data=additional_rows; 
run;

在此之前,我首先要确定SAS表中添加的行。我必须在SAS中为更新的行做同样的事情。以下是旧表和新表的示例:

Old Table
colA  colB          colC       colD
BAC   Jul-31-2014    45        2.24
CAD   Jul-31-2014    98        10.2

New Table
colA  colB          colC       colD
BAC   Jul-31-2014    65        2.24
CAD   Jul-31-2014    98        10.2
BAC   AUG-01-2014    22         3.3
ABC   AUG-01-2014    32         5.2

正如您所看到的,新表有2行,并且row1 colc值已更新。

这是我用来从SAS更新oracle中的表的代码。

PROC SQL; 
UPDATE old_table as a SET new_table = (SELECT b.colc
FROM sas.new_table as b 
WHERE a.colA=b.colA and
a.colB = b.colB
) 
WHERE exists 
(select * from sas.new_table as b 
WHERE a.colA=b.colA and a.colB = b.colB
); 
QUIT;

有没有办法将Oracle中的旧表更新为SAS中的新表,并附加行和更改的行?有更简单的方法,请告诉我。 感谢

2 个答案:

答案 0 :(得分:0)

合并可能就是你要找的东西:

merge into old_table o
using sas.new_table n
on (a.colA=b.colA and a.colB = b.colB)
when matched then
     update set o.colC = n.colC, o.colD = n.colD
when not matched then
     insert (colA, colB, colC, colD) values(n.colA, n.colB, n.colC, n.colD);

答案 1 :(得分:0)

向我标识它的最简单方法似乎是加入或exists查询(或数据步合并)。假设您在oracle表上有索引,而ID列上的SAS表(示例中为colAcolB),这应该相当快。

proc sql;
  create view sas.additional_rows as
   select * from sas.new_table S
     where not exists (
       select 1 from abc.old_table O
         where O.colA=S.colA
           and O.colB=S.colB
     );

  create view sas.to_update as
   select * from sas.new_table S
     where exists (
       select 1 from abc.old_table O
         where O.colA=S.colA
           and O.colB=S.colB
           and O.colC ne S.colC
     );
quit;

然后从该视图中proc append(或者如果结果表明提供更好的性能,则将其设为表格 - 如果它的比例相对较小,则表格可能更快)。如果您希望更快地上传大型数据集,请添加BCP或任何适当的选项允许批量加载/复制(BCP用于SQL Server,不确定Oracle的等效项。)

要添加更新的,我会从Oracle中删除要更新的行,然后重新插入它们;我发现这通常比更新声明更快,但我不是那里的专家。您还可以将additional_rowsto_update的组合放在临时表中,并使用其他答案的merge into语法。

相关问题