sas – 限制PROC SQL中的结果
我试图使用PROC SQL来查询具有数亿条记录的DB2表.在开发阶段,我想在这些记录的任意小的子集上运行我的查询(例如,1000).我尝试使用INOBS来限制观察值,但我相信这个参数只是限制SAS正在处理的记录数.我希望SAS只从数据库中获取任意数量的记录(然后处理它们).
如果我自己编写一个SQL查询,我只需使用SELECT * FROM x FETCH FIRST 1000 ROWS ONLY …(相当于SQL Server中的SELECT TOP 1000 * FROM x).但是,PROC SQL似乎没有这样的选项.拍摄记录需要很长时间. 问题:如何指示SAS任意限制从数据库返回的记录数. 我读过PROC SQL使用ANSI SQL,它没有行限制关键字的任何规范. SAS可能不希望将其SQL语法转换为特定于供应商的关键字?有没有工作? 解决方法当SAS通过SAS语法与数据库进行通信时,部分查询可以转换为DBMS语言相当的 – 这被称为隐式通过.查询的其余部分由SAS进行“后处理”以产生最终结果.根据SAS版本,DBMS供应商和DBMS版本,在某些情况下甚至还有一些连接/ libname选项,SAS语法的不同部分可以在SAS和DBMS之间进行翻译/考虑兼容,因此由DBMS而不是SAS执行. 使用SAS SQL选项 – INOBS和OUTOBS – 我通过不同版本的SAS对MS SQL和Oracle进行了很多工作,但我还没有看到曾经翻译成TOP xxx类型的查询,所以这可能还不支持,虽然当查询仅触发DMBS数据(不连接到SAS数据等)时,应该是相当可行的. 所以我想你还有一个所谓的明确的直通SAS SQL语法来连接数据库.这种类型的查询如下所示: proc sql; connect to oracle as db1 (user=user1 pw=pasw1 path=DB1); create table test_table as select * from connection to db1 ( /* here we're in oracle */ select * from test.table1 where rownum <20 ) ; disconnect from db1; quit; 在SAS 9.3中,可以简化语法 – 如果已经有LIBNAME连接,则可以将其重用于显式传递: LIBNAME ORALIB ORACLE user=...; PROC SQL; connect to oracle using ORALIB; create table work.test_table as select * from connection to ORALIB ( .... 当使用libname连接时,请务必在加载数据库时使用READBUFF(通常设置大约5000个左右)或INSERTBUFF选项(1000个或更多). 要查看是否发生隐式通过,请设置sastrace选项: option sastrace=',ds' sastraceloc=saslog nostsuffix; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |