2013-10-08 63 views
5

通常のSASサブクエリのように、DB1テーブルの識別子に一致するレコードのリストをDB2から取得したいとします。 SASパススルーSQLでどのように実行できますか?SASパススルーSQL - 複数のデータベース

db1で(長い複雑な)SQLを実行するには、通常のSAS 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; 

答えて

1

あなたは、別のパススルークエリにパススルークエリを実行することはできませんネイティブシステムでの利点

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

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

2

あなたは、単一の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値の数が重要になります。

関連する問題