Join von Oracletabellen aus verschiedenen Librefs

Hallo zusammen,

ich habe versucht 2 Oracletabellen, die in verschiedenen Librefs sind, zu joinen. Der Join wird durchgeführt, jedoch kommt mit der SASTRACE Option eine Fehlermeldung:

ERROR: This SQL statement will not be passed to the DBMS for processing 
because it involves a join across librefs with different connection properties.

Was bedeutet das konkret? Werden hier zunächst die Tabellen zumindets satzweise nach SAS geladen und dann gejoined?
Gibt es hier eine Möglichkeit, dass der Join in Oracle durchgeführt wird?

Weitere Logmeldung mit SASTRACE

  80 1155202020 orprep 0 SQL
ORACLE_21: Prepared: 81 1155202020 orprep 0 SQL
SELECT * FROM ETL_ADMIN.VERM_VEBAS_OE 82 1155202020 orprep 0 SQL
  83 1155202020 orprep 0 SQL
  84 1155202020 orprep 0 SQL
ORACLE_22: Prepared: 85 1155202020 orprep 0 SQL
SELECT * FROM ETL_ADMIN.V_VERM_HIBA_R 86 1155202020 orprep 0 SQL
  87 1155202020 orprep 0 SQL
  88 1155202020 orprep 0 SQL
ORACLE_23: Prepared: 89 1155202020 orprep 0 SQL
SELECT  "OESL", "EDAT" FROM ETL_ADMIN.V_VERM_HIBA_R  90 1155202020 orprep 0 SQL
  91 1155202020 orprep 0 SQL
  92 1155202020 orgeti 0 SQL
ORACLE_24: Executed: 93 1155202020 orgeti 0 SQL
SELECT statement  ORACLE_23 94 1155202020 orgeti 0 SQL
  95 1155202020 orgeti 0 SQL
  96 1155202034 orprep 0 SQL
ORACLE_25: Prepared: 97 1155202034 orprep 0 SQL
SELECT  "OESL" FROM ETL_ADMIN.VERM_VEBAS_OE  98 1155202034 orprep 0 SQL
  99 1155202034 orprep 0 SQL
  100 1155202034 orgeti 0 SQL
ORACLE_26: Executed: 101 1155202034 orgeti 0 SQL
SELECT statement  ORACLE_25 102 1155202034 orgeti 0 SQL
  103 1155202034 orgeti 0 SQL

Gruß
Wolfgang Hornung

Join nicht über Oracle

Ohne den Log auf die Schnelle zu verstehen: Diese Meldung heißt wohl tatsächlich, dass für die benötigten Spalten der Tabellen alle Sätze komplett nach SAS geladen und dort gejoint werden. "Different Connection Properties" kann natürlich sehr unterschiedliches heißen. Liegen die Librefs in unterschiedlichen Datenbanken oder warum brauchen Sie zwei Librefs? Wäre denn innerhalb von Oracle überhaupt ein Join zwischen den Tabellen möglich?

Join

ich habe inzwischen herausgefunden, dass die Tabellen in verschiedenen Datenbanken liegen, daher brauch ich dann natürlich auch verschiedenen Librefs. Die Antwort auf Ihre letzte Frage nach der Möglichkeit eines solchen Joins wäre dann tatsächlich interessant.
In der OnlineDoc habe ich das hier gefunden.
Was bedeutet das

The SQL query involves multiple librefs 
that do not share connection characteristics.

If the librefs are specified using different servers, 
user IDs, or any other connection options, 
PROC SQL will not attempt to pass the statement 
to the DBMS for direct processing.

genau? Wenn angenommen die Datenbanken auf demselben Server liegen und der technische User derselbe ist, sind mit den "any other connection options" dann die Optionen, wie CONNECTION_GROUP etc. gemeint?

Gruß
Wolfgang Hornung

Andere Möglichkeit: Pass Through

Zunächst als Antwort auf Ihre Frage: ich interpretiere den von Ihnen genannten Absatz so, dass SAS die Abfrage nicht vom DBMS ausführen lässt, wenn sich die beiden Librefs von Ihrer Definition her unterschieden, und das ist bei Ihnen sicher der Fall.

Falls Oracle prinzipiell den Join über verschiedene Datenbanken hinweg unterstützt, gibt es als Möglichkeit noch Pass Through. Damit kann man erzwingen, dass eine bestimmte SQL-Abfrage vom DBMS ausgeführt wird.

Pass Through

ich fürchte, dass es da keine Möglichkeit gibt, ausser vielleicht auf Oracleseite zu sagen "Pass auf Datenbank1 es gibt dort die Datenbank2 etc.". Ein Pass Through wie

proc sql;

connect to oracle as dbms1
   (user=user1 pw=pwd1
    path=
'pfad1'
    
connection=global);

connect to oracle as dbms2
   (user=user2 pw=pwd2
    path=
'pfad2'
    
connection=global);


create table c as select datum from

   
(select * from connection to dbms1(select datum from tabelle1)) a,
   (
select * from connection to dbms2(select date  from tabelle2)) b
    
where a.datum > b.date;

    
disconnect from dbms1;
    
disconnect from dbms2;

quit;

funktioniert leider nicht. Aus der OnlineDoc geht nicht hervor, wie eine solche Query über 2 DBMS gehen soll, wahrscheinlich geht es einfach nicht. Wenn man, um beim obigen Beispiel zu bleiben, von der Tabelle2 ein View in DBMS1 erstellt, dann wird es wahrscheinlich gehen, dann kann man aber gleich alle Tabellen in einer Datenbank anlegen.

Das ganze kam daher auf, da wir unser DWH so konzipiert haben, dass wir thematisch zusammengehörende Tabellen in einer Library haben. Dieses Librarykonzept lässt sich dann wohl auf Oracleseite nicht aufrechterhalten, oder doch?

Dennoch schon einmal vielen Dank für Ihre Hilfe!

Gruß
Wolfgang Hornung

Pass auf Datenbank1 es gibt dort die Datenbank2

Der Join muss schon direkt in Oracle stattfinden. Ihr Verfahren würde ja wieder beinhalten, dass erst beide Tabellen nach SAS geladen werden müssen.

Mit Oracle kenne ich mich eigentlich nicht aus, aber ein Kollege hier sagt, es gehe so, dass man nämlich tatsächlich in der einen Datenbank einen Link auf eine andere Datenbank erzeugt:

  1. Man muss in einer der beiden Datenbanken einen Datenbank-Link erzeugen, zum Beispiel in Datenbank1 auf Datenbank2:

    CREATE PUBLIC DATABASE LINK dblink USING 'Datenbank2'
  2. Natürlich braucht man dazu die richtigen Rechte, aber man muss diesen Link nur einmal anlegen.

  3. Man kann nun in SQL-Abfragen Tabellen, die in der "anderen" Datenbank liegen, in der Form "tabelle2@dblink" ansprechen.
  4. Nun kann man in SAS PROC SQL eine SQL-Abfrage mit Pass-Through absetzen.

Das ist ja erfreulich

vielen Dank!

Gruß
Wolfgang Hornung