如何在维护现有索引的同时执行多个左连接?
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;
在 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;