2016-01-11 1 views
0

У меня есть требование, когда мои две таблицы расположены в двух разных базах данных.Scriptella: Имитация запроса Внутренний/внешний Присоединиться к сценарию ETL

Так что, по существу, я не могу написать запрос на соединение. Теперь вопрос в том, как я могу написать файл ETL, который по существу помогает мне моделировать внутреннее соединение в scriptella.

Order table 
{OrderID, CustomerID, OrderDate} 
Customer Table 
{CustomerID, CustomerName} 

Хотелось бы, чтобы имитировать следующий запрос в scriptella:

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDate 
FROM Orders 
INNER JOIN Customers 
ON Orders.CustomerID=Customers.CustomerID 

Спасибо, Дипак

ответ

0

Вы в основном нужно 2 вложенных запросов, чтобы эмулировать внутренние соединения. Первый запрос (Q1) выбирает все строки из одной таблицы. Для каждой найденной строки из Q1 выполняется второй запрос (Q2). Результаты отправляются во внутренний скриптовый элемент внутри Q2.

<!DOCTYPE etl SYSTEM "http://scriptella.javaforge.com/dtd/etl.dtd"> 
<etl> 
    <!-- db1 has Customers table --> 
    <connection id="db1" url="jdbc:database1" user="user1" password="pwd1" classpath="external.jar"/> 

    <!-- db2 has Orders table --> 
    <connection id="db2" url="jdbc:database2" user="user2" password="pwd2" classpath="somedriver.jar"/> 

    <!-- just for logging --> 
    <connection id="log" driver="text"/> 

    <query connection-id="db1"> 
     <!-- SELECT CustomerID/name for all rows from Customer --> 
     SELECT CustomerID, CustomerName from Customer 

     <!-- For each selected customer row, select matching orders --> 
     <query connection-id="db2"> 
      SELECT OrderID, OrderDate FROM Orders WHERE CustomerID=?CustomerID 
      <!-- Log each match. You can also make INSERT to any DB here --> 
      <script connection-id="log"> 
        Row $rownum: Orders.OrderID=$OrderID, Customers.CustomerName=$CustomerName, Orders.OrderDate=$OrderDate 
      </script> 
     </query> 
    </query> 
<etl>