【问题标题】:SAS Pass-through SQL - Multiple DBsSAS 直通 SQL - 多个数据库
【发布时间】:2013-10-09 03:25:30
【问题描述】:

我想从 DB2 中检索与 DB1 表中的标识符匹配的记录列表,就像常规的 SAS 子查询一样。如何使用 SAS 直通 SQL 执行该操作?

使用常规的 SAS SQL 在 db1 上执行(长而复杂的)SQL 太慢了,这就是我改用直通 SQL 的原因。

我尝试了以下但没有运气:

proc sql;
    connect to db1 as A (user=&userid. password=&userpw.  database=MY_DB);
    connect to db2 as B (user=&userid. password=&userpw.  database=MY_DB);

    create table test as
    select * from connection to B (
        select * from schema.table
            Where ID_NUM =
                (select * from connection to A
                      (select ID_NUM from schema2.table2)
                );
        );
   disconnect from A;
   disconnect from B;
quit;

【问题讨论】:

    标签: sql sas pass-through


    【解决方案1】:

    如果您要连接到单个 DB2 实例并连接不同模式/数据库中的两个表,则以下内容应该适合您:

    proc sql;
        connect to db2 as B (user=&userid. password=&userpw.  database=MY_DB);
    
        create table test as
        select * from connection to B (
                /* here we're in DB2 SQL */
            select t1.* from schema.table as t1
                    inner join schema2.table2 as t2
                on t1.ID_NUM = t2.ID_NUM
            );
       /* automatic disconnect at PROC SQL boundary */
    quit;
    

    如果您与两个不同的服务器/两个用户帐户通信,则可以使用没有传递的异构连接。那么 ID_NUM 值的预期数量就很重要了。

    【讨论】:

      【解决方案2】:

      您不能对另一个直通查询执行直通查询,除非您的两个数据库以某种方式自然连接,您可以在本机系统中利用这些方式。

      执行此类操作的唯一方法是执行connection to A 查询并将结果存储在一个宏变量(ID_NUM 列表)中,然后将该宏变量插入到connection to B 的查询中。

      最好不要在这里显式使用直通,而是使用libname 并像往常一样执行查询。 SAS 可能会在这里为您提供帮助并为您完成工作,而无需首先实际复制 B 的所有行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-22
        • 1970-01-01
        • 1970-01-01
        • 2014-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多