我在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中的新表,并附加行和更改的行?有更简单的方法,请告诉我。 感谢
答案 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表(示例中为colA
和colB
),这应该相当快。
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_rows
和to_update
的组合放在临时表中,并使用其他答案的merge into
语法。