SAS:PROC SQL和ANSI标准

作者 : admin 本文共1148个字,预计阅读时间需要3分钟 发布时间: 2024-06-12 共1人阅读

文章来源于SAS HELP

  • PROC SQL 和ANSI SQL 的区别——图表和视图名称的作用域规则不同
    例1:匹配数据集相关名称
    当PROC SQL匹配数据集相关名称时,会依次进行3个步骤:1、有别名,用别名匹配;2、1匹配失败,在无别名的数据集中用数据集名匹配;3、2匹配失败,用有别名的数据集名匹配。
proc sql noprint;
	create table test as
	select dm.subjid,1 as lmg length = 8
	from dm as dm,
		 ae as ae
	where dm.subjid = ae.subjid
	and	  dm.sex = 'M'
	and   not exists (select *
					  from dm as d
					  where d.subjid = dm.subjid
					  and   strip(d.sex)  'F'
					  );
quit;

在not exist条件中,proc sql先用别名d去匹配(where筛选等号左边的条件),匹配成功;where筛选等号右边的条件dm.subjid属于有别名d,用dm匹配(属于前2个步骤都没有匹配到,用第3个步骤才成功匹配),也就等价于

where d.subjid = d.subjid
and   strip(d.sex)  'F'

继而等价于

where strip(d.sex)  'F'

注意:如果PROC SQL使用ISO/ANSI SQL:相关名称匹配标准2012,那么where等式右边的dm.subjid就可以用高等级select语句匹配,即从not exist内部查询语句中跳出到外部select语句中进行匹配

为了与ISO/ANSI SQL匹配规则一致,可以修改相应查询语句。比如在例1中确保外部作用域和内部作用域有不同的别名。

proc sql noprint;
	create table test as
	select dm.subjid,1 as lmg length = 8
	from dm as d1,
		 ae as ae
	where d1.subjid = ae.subjid
	and	  dm.sex = 'M'
	and   not exists (select *
					  from dm as d2
					  where d2.subjid = d1.subjid
					  and   strip(d2.sex)  'F'
					  );
quit;

例2:模糊引用
在相同的作用域内有两个相同的dm的引用,DBMS与ANSI SQL标准完全一致,因此会检测到dm.xxx模棱两可。但是对于PROC SQL来说却不会觉得模糊,因为按照例1的逻辑,会首先对有别的的数据集进行匹配,所以这里的where条件实际上筛选到的是来自ae数据集中筛选号长度大于3的筛选号。

proc sql noprint;
	create table test as
	select dm.subjid
	from   dm,ae as dm
	where dm.length(subjid)>3;	
quit;

拓展:PROC SQL exists子查询
SAS:PROC SQL和ANSI标准插图

本站无任何商业行为
个人在线分享 » SAS:PROC SQL和ANSI标准
E-->