2013-10-08 11 views
5

Desidero recuperare da DB2 l'elenco di record che corrisponde agli identificatori in una tabella DB1, come una subquery SAS regolare. Come posso farlo con SQL pass-through SQL?SQL Pass-through SQL - DB multipli

L'esecuzione del (lungo e complesso) SQL su db1 è troppo lento utilizzando un normale SAS SQL, per questo motivo ricorro al pass-through SQL.

Ho provato quanto segue ma senza fortuna:

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; 

risposta

1

Non è possibile eseguire una query pass-through per un'altra query pass-through, a meno che i due database sono naturalmente collegati in qualche modo che si potrebbe prendere vantaggio nel sistema nativo.

L'unico modo per eseguire un'operazione simile è eseguire la query connection to A e archiviare tale risultato in una variabile macro (l'elenco di ID_NUM), quindi inserire la variabile macro nella query per connection to B.

Potrebbe essere meglio non utilizzare passthrough in modo esplicito qui, ma utilizzare libname ed eseguire la query come si farebbe normalmente. SAS potrebbe aiutarvi a risolvere il problema e fare il lavoro per voi, senza in realtà copiare prima tutte le righe di B.

2

Se ci si collega a singola istanza DB2 e unire due tavoli in diversi schemi/database, il seguente dovrebbe funzionare per voi:

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; 

Se si parla di due diversi server/due account utente di un eterogeneo potrebbe essere utilizzato senza pass-through. Quindi il numero previsto di valori ID_NUM sarebbe importante.

Problemi correlati