【问题标题】:Update an oracle table from another table in SAS从 SAS 中的另一个表更新一个 oracle 表
【发布时间】:2014-08-01 13:12:36
【问题描述】:

我在 Oracle 中有一个从 SAS 插入的 1000 万行表。每周都会在 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 中的新表,其中包含额外的行和更改的行?有没有更简单的方法,请告诉我。 谢谢

【问题讨论】:

    标签: sql oracle sas


    【解决方案1】:

    对我来说,识别它的最简单方法似乎是连接或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或哪种适当的选项允许批量加载/复制(@ 987654327,SQL Server,不确定Oracle的等效项)如果要更快地上传大型数据集。

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

    【讨论】:

    • 谢谢乔!什么是“选择 1”?目前我的 oracle 表上没有索引。您能否指导我阅读任何提供索引 oracle 表的好方法的文章或论文?我很感激。我确实尝试过在线搜索,但真的不明白应该索引哪些列才能加快搜索速度。
    • 不是甲骨文专家,所以我只是谷歌索引。如果您没有索引,则此查询将起作用,只是速度较慢。 SAS 表也一样 - 如果还没有,你也应该索引它。您应该索引您要加入的列,假设它们是索引的良好候选者(两者的组合唯一或接近唯一标识一行)。
    • 另外,这段代码会给我所有的新行和更新的行。如果我使用 proc append,那么所有行都将添加到旧表中。但我想根据 cola 和 colb 匹配更新 colc 的值。
    【解决方案2】:

    Merge 可能就是你要找的东西:

    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);
    

    【讨论】:

    • 鉴于用户拥有完整的 10m+ 数据作为 SAS 表,这将需要他将整个数据上传到 Oracle 表 - 还不如重写整个表。
    • 感谢伊曼纽尔!这是一个很好的解决方案,但是对于每周更新 1000 万个表来说,这是一个不错的选择吗?
    猜你喜欢
    • 2018-07-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 2012-04-07
    • 2011-10-25
    相关资源
    最近更新 更多