Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在SAS中编写递归代码的正确方法_Sql_Sas_Sas Macro - Fatal编程技术网

Sql 在SAS中编写递归代码的正确方法

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

我有两张桌子在用

首先是基本信息,如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 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哈希表解决方案,如上面的链接所示,在这里似乎是合适的。