SAS:PROC SQL和ANSI标准

文章来源于SAS HELP

  • PROC SQL 和ANSI SQL 的区别------图表和视图名称的作用域规则不同
    例1:匹配数据集相关名称
    当PROC SQL匹配数据集相关名称时,会依次进行3个步骤:1、有别名,用别名匹配;2、1匹配失败,在无别名的数据集中用数据集名匹配;3、2匹配失败,用有别名的数据集名匹配。
sql 复制代码
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个步骤才成功匹配),也就等价于

sql 复制代码
where d.subjid = d.subjid
and   strip(d.sex) <> 'F'

继而等价于

sql 复制代码
where strip(d.sex) <> 'F'

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

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

sql 复制代码
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的筛选号。

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

拓展:PROC SQL exists子查询

相关推荐
2401_cf40 分钟前
为什么hadoop不用Java的序列化?
java·hadoop·eclipse
帮帮志44 分钟前
idea整合maven环境配置
java·maven·intellij-idea
LuckyTHP1 小时前
java 使用zxing生成条形码(可自定义文字位置、边框样式)
java·开发语言·python
技术宝哥3 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
无声旅者4 小时前
深度解析 IDEA 集成 Continue 插件:提升开发效率的全流程指南
java·ide·ai·intellij-idea·ai编程·continue·openapi
学地理的小胖砸4 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
不知几秋4 小时前
sqlilab-Less-18
sql
Ryan-Joee4 小时前
Spring Boot三层架构设计模式
java·spring boot
Hygge-star4 小时前
【数据结构】二分查找5.12
java·数据结构·程序人生·算法·学习方法
dddaidai1234 小时前
Redis解析
数据库·redis·缓存