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

How do I perform multiple left joins while maintaining an existing index?

在 SAS 中,我有一个大的 table,我想通过执行左连接(或等效)来增加来自多个小 table 的信息。我的逻辑需要很多步骤(即不能同时加入所有内容)。每次加入后,我想保留 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;

/*...*/

更好的当然是执行一个查询。但是如果你没有那个能力,你有几个选择。

最像 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;

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

以视图为中心的解决方案使 large_table 扩展响应小型 table 概念格式更新时小型 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;