6

通常の SAS サブクエリのように、DB1 テーブルの識別子に一致するレコードのリストを DB2 から取得したいと考えています。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;
4

2 に答える 2

3

単一の DB2 インスタンスに接続し、異なるスキーマ/データベースの 2 つのテーブルを結合している場合は、次のように動作するはずです。

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;

2 つの異なるサーバー/2 つのユーザー アカウントと通信する場合、パススルーのない異種結合を使用できます。次に、予想される ID_NUM 値の数が重要になります。

于 2013-10-08T19:25:30.913 に答える
1

ネイティブ システムで利用できる何らかの方法で 2 つのデータベースが自然に接続されていない限り、別のパススルー クエリに対してパススルー クエリを実行することはできません。

このようなことを行う唯一の方法は、connection to Aクエリを実行して結果をマクロ変数 (ID_NUM のリスト) に格納し、そのマクロ変数を のクエリに挿入することですconnection to B

ここではパススルーを明示的に使用するのではなく、libname通常どおりにクエリを使用して実行する方がよい場合があります。SAS はここであなたを助け、最初に B のすべての行を実際にコピーすることなく作業を行うことができます。

于 2013-10-08T19:04:28.893 に答える