Sql 在SAS中编写递归代码的正确方法
我有两张桌子在用 首先是基本信息,如RK、ID和姓名等 第二个表创建层次结构,并将列作为RK和Parent_RK 我想把一张唱片的所有子唱片都放在他的整个等级制度下 我的代码是Sql 在SAS中编写递归代码的正确方法,sql,sas,sas-macro,Sql,Sas,Sas Macro,我有两张桌子在用 首先是基本信息,如RK、ID和姓名等 第二个表创建层次结构,并将列作为RK和Parent_RK 我想把一张唱片的所有子唱片都放在他的整个等级制度下 我的代码是 %let _MO = 11382; proc sql noprint; create table management( rk int, ID varchar(4000), Name varchar(4000) ); quit; %macro recursive(MO); %put &MO; proc s
%let _MO = 11382;
proc sql noprint;
create table management(
rk int,
ID varchar(4000),
Name varchar(4000)
);
quit;
%macro recursive(MO);
%put &MO;
proc sql noprint;
insert into management
select distinct Par.management_org_rk, Mo.management_org_id,Mo.Organization_nm
from Sasoprsk.Management_org_assoc_l par
inner join Sasoprsk.Management_org_l Mo on Mo.management_org_rk = par.management_org_rk
where par.management_org_rk = &MO;
select distinct management_org_rk
into: MO_List separated by "|"
from Sasoprsk.Management_org_assoc_l
where Parent_management_org_rk = &MO
and MANAGEMENT_ORG_ASSOC_TYPE_CD = 'DEF';
select count(distinct management_org_rk)
into: count
from Sasoprsk.Management_org_assoc_l
where Parent_management_org_rk = &MO
and MANAGEMENT_ORG_ASSOC_TYPE_CD = 'DEF';
quit;
%put &MO_List;
%put &count;
%if &count ne 0 %then
%do i=1 %to &count;
%let Child=%scan(%bquote(&MO_List), %bquote(&i) ,%str(|));
%recursive(&Child);
%put &i;
%end;
%mend;
%recursive(&_MO);
试运行
第一个周期
假设MO 11382有3个孩子
MO_List = 11383|11384|1138
count = 3
child = 11383
第二周期
MO 11383有两个孩子
MO_List = 11386|11387
count =2
child = 11386
第三周期
莫11386没有孩子
MO_List =11386|11387;
count = 0;
i=1;
MO_List =11386|11387;
count = 0;
i=2;
现在系统将返回到第二个循环
MO=11387没有孩子
MO_List =11386|11387;
count = 0;
i=1;
MO_List =11386|11387;
count = 0;
i=2;
现在系统将返回到第一个循环
由于MOU列表已更新,因此无法继续。
请建议我一个更好的方法来获取MO的所有子项。在服务器中有十个层次结构,所以我不能硬编码
我们可以在do循环中执行多线程,而不是使用第一个子线程执行,他应该首先将所有子线程发送到宏,然后对它们的子线程执行相同的操作
层次结构就像一棵有多个节点的树 该宏的主要修复方法是确保将宏变量定义为本地变量。这对于任何可能被其他宏调用的宏来说都很重要,以防止它覆盖已存在的具有这些名称的宏变量。显然,递归调用宏时,宏变量名肯定存在冲突
%macro recursive(MO);
%local mo_list count i ;
...
请注意,您还可以消除重复查询以计算写入MOU列表的值的数量。SAS已经为您计算过了
select distinct management_org_rk
into :MO_List separated by "|"
from Sasoprsk.Management_org_assoc_l
where Parent_management_org_rk = &MO
and MANAGEMENT_ORG_ASSOC_TYPE_CD = 'DEF'
;
%let count=&sqlobs;
可能的重复项进一步解释结构,并描述每个变量的作用、目的和约束
RK
ID
etcA哈希表解决方案,如上面的链接所示,在这里似乎是合适的。