如何在维护现有索引的同时执行多个左连接?

时间:2018-05-18 13:59:40

标签: indexing sas proc-sql

在SAS中,我有一个大表,我希望通过执行左连接(或等效)来增加来自多个小表的信息。我的逻辑需要很多步骤(即不能同时加入所有内容)。每次加入后,我想保留large_table的现有索引,充分利用它。如何重写以下代码来完成此任务?

/*Join 1*/
proc sql;
  create table large_table as
  select a.*, b.newinfo1
  from large_table a
  left join small_table1 b on a.id = b.id;
quit;

/*some logic*/

/*Join 2*/
proc sql;
  create table large_table as
  select a.*, b.newinfo2
  from large_table a
  left join small_table2 b on a.id = b.id;
quit;

/*...*/

2 个答案:

答案 0 :(得分:1)

更好的是执行一个查询。但如果你没有这种能力,你可以选择一些。

最类似SAS的不是SQL查询,而是MODIFY语句。这将执行左连接,并修改主数据集 - 不会替换它。您必须为此预先定义所有变量才能工作。

data class(index=(name));
  set sashelp.class;
  call missing(predict);  *define PREDICT so it is available to be updated;
  where sex='F';
run;

data classfit(index=(name));
  set sashelp.classfit;
run;

data class;
  modify class classfit;  *only PREDICT will be appended here;
  by name;
  select (_IORC_);  *this processes the 'left' join;
    when (%sysrc(_sok))  replace;   *if in master then replace;
    when (%sysrc(_dsenmr)) delete;  *if not in master then delete;
    otherwise abort;
  end;
run;

proc contents data=class;
run;

您可以使用UPDATE语句在SQL中执行类似的操作。

proc sql;
  update class
    set predict = (
      select predict from classfit
      where class.name=classfit.name
      );
quit;

proc contents data=class;
run;

答案 1 :(得分:1)

单个新列的左连接等效项是SAS自定义格式。从小表创建两个新的自定义格式,而不是重建大表,创建一个重复id两次的视图,将新格式应用于重复 - 扩展信息的视图范围。

以视图为中心的解决方案使large_table扩展能够在更新小表概念格式时响应小表中的任何更改。

例如

data fmt1 / view=fmt1;
  fmtname = 'small_1_concept';
  set small_table1(rename=(id=start newinfo1=label));
run;
data fmt2 / view=fmt2;
  fmtname = 'small_2_concept';
  set small_table2(rename=(id=start newinfo2=label));
run;

proc format cntlin=fmt1;
proc format cntlin=fmt2;

proc sql;
  create view large_table_extended_v as
  select 
    large_table.*
  , id as id1 format=small_1_concept.
  , id as id2 format=small_2_concept.
  from
    large_table
  ;
quit;