2013-10-08 9 views
5

Ich möchte von DB2 die Liste der Datensätze abrufen, die mit den Kennungen in einer DB1-Tabelle übereinstimmen, wie eine normale SAS-Unterabfrage. Wie kann ich das mit SAS Pass-Through SQL durchführen?SAS-Pass-Through-SQL - Mehrere DBs

Die Ausführung des (langen und komplexen) SQL auf db1 ist zu langsam mit einer normalen SAS SQL, deshalb verwende ich stattdessen Pass-Through SQL.

versuchte ich folgendes aber kein Glück:

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; 

Antwort

1

Sie natürlich nicht in irgendeiner Weise verbunden durchführen können, sind eine Pass-Through-Abfrage an einen anderen Pass-Through-Abfrage, es sei denn, Ihre zwei Datenbanken, die Sie ergreifen könnten Vorteil von im nativen System.

Der einzige Weg, etwas zu tun, wie dies die connection to A Abfrage und Speicherung auszuführen wäre, die in einer Makrovariablen (die Liste der ID_NUMs) zur Folge hat, und setzen Sie dann die Makrovariable in die Abfrage für connection to B.

Es ist vielleicht besser, Passthrough hier nicht explizit zu verwenden, sondern stattdessen libname zu verwenden und die Abfrage wie gewohnt auszuführen. SAS kann Ihnen hier helfen und die Arbeit für Sie erledigen, ohne tatsächlich alle Zeilen von B zuerst zu kopieren.

2

Wenn Sie einzelne DB2-Instanz sich verbinden und Verbinden von zwei Tabellen in verschiedenen Schemata/Datenbanken, sollte die folgende für Sie arbeiten:

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; 

Wenn Sie zu zwei verschiedenen Servern/zwei Benutzerkonten sprechen ein heterogenes Join ohne Pass-Through könnte verwendet werden. Dann wäre die erwartete Anzahl von ID_NUM-Werten wichtig.