【问题标题】:Merging a SAS table with a SQL passthrough将 SAS 表与 SQL 直通合并
【发布时间】:2016-12-30 15:11:05
【问题描述】:

我正在尝试在 SQL 直通中合并 SAS 表,以帮助减少查询 SQL 数据库所需的时间。目前我只是按原样使用直通,大约需要 8-9 个小时才能从表中提取所有内容,然后再选择我想要的内容。

目前的直通看起来是这样的:

proc sql;
    connect to ODBC as CAW(datasrc = "CAW_ULI_STATIC");
    create table test  as 
        select aelref, aelprdtyp, aelsubtyp, aelloc, aelopndte,
         hdscontrolopendate, hdscontrolclosedate, hdscontrolaction,
        from connection to CAW (
                                select aelref, aelprdtyp, aelsubtyp, aelloc, aelextnbr, aelbrnpfx, aelitnnbr, aelopndte,
                                         aelclddte, hdscontrolopendate, hdscontrolclosedate, hdscontrolaction
                                from PUBLIC_withpersonal_short.Vwhdscisagrmnt (nolock)

                                where HDSControlACTION <> 'D' 
                                    and aelsubtyp in (1, 2, 3, 4, 5, 10, 20, 21)
                                order by aelref, hdscontrolopendate, hdscontrolclosedate
                                ); 
disconnect from CAW;
; 
quit;

但我现在正尝试使用另一个 SAS 数据集通过左连接来缩小我从直通中提取的范围,因此它看起来像这样:

    proc sql;
        connect to ODBC as CAW(datasrc = "CAW_ULI_STATIC");
        create table test  as 
            select a.*, aelref, aelprdtyp, aelsubtyp, aelloc, aelopndte,
             hdscontrolopendate, hdscontrolclosedate, hdscontrolaction,
            from Import1 a left join connection to CAW (
                                    select aelref, aelprdtyp, aelsubtyp, aelloc, aelextnbr, aelbrnpfx, aelitnnbr, aelopndte,
                                             aelclddte, hdscontrolopendate, hdscontrolclosedate, hdscontrolaction
                                    from PUBLIC_withpersonal_short.Vwhdscisagrmnt (nolock)

                                    where HDSControlACTION <> 'D' 
                                        and aelsubtyp in (1, 2, 3, 4, 5, 10, 20, 21)
                                    order by aelref, hdscontrolopendate, hdscontrolclosedate
                                    ); 
    disconnect from CAW b;
    on a.ANUM = b.aelextnbr
    ; 
    quit;

但它似乎不喜欢在连接之前添加连接。这是正确的方法吗,还是我错过了什么?

谢谢。

【问题讨论】:

  • 除非您的 SAS 系统真的很慢,否则几乎所有的 8-9 小时都花在了远程处理和发回数据上。事后过滤不会对性能有太大帮助。
  • 什么 RDMS? SQL Server、Oracle、DB2、Postgres、MySQL?在 DBMS 控制台中查询需要多长时间? SAS 是与数据库驻留在同一服务器上还是远程驻留?

标签: sql sas left-join pass-through


【解决方案1】:

没有。您的第二个 SQL 查询只会减少写入的记录数,但 SAS 仍需要从您的 ODBC 连接中提取所有记录才能执行连接。

将您的 IMPORT1 SAS 数据集推送到您的 ODBC 数据库并在那里执行连接。

或者,如果记录数足够少,则使用宏变量生成 ANUM 值列表以将其包含在查询中。像这样的:

 proc sql noprint ;
   select ANUM into :list separated by ',' from import1;
   connect .... ;
   select ... from connection to odbc
    (... where aelextnbr in (&list)
    );
 quit;

【讨论】:

  • "将您的 IMPORT1 SAS 数据集推入您的 ODBC 数据库并在那里执行连接。"但是如果我在那里没有写权限怎么办?
  • @Rohit 在 DBA 大喊,并询问您应该如何在没有任何地方存储临时表的情况下有效地使用数据库(TABLE 是数据库代表 DATASET。)
  • 您仍然处于活动状态 :) 我使用 select into 您提供的代码 stackoverflow.com/questions/68062109/… 但错误。如果您提供帮助将非常感激
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多