RhinoETL - объединить две таблицы в качестве входных данных, записать в две таблицы на выходе - PullRequest
3 голосов
/ 14 декабря 2010

Я пишу работу ETL, в C #, используя Rhino ETL

У меня есть база данных на сервере А. Это имеет 2 таблицы:

(пример)

tblOrder

  • OrderID
  • CustomerName
  • CustomerEmailAddress
  • Переведен

tblOrderLine

  • OrderID
  • ProductID
  • ProductName
  • Цена

На сервере B он имеет идентичную таблицу (заказы передаются из Интернета в нашу бэкэнд-систему)

Используя RhinoETL, моя InputCommandOperation в настоящее время выглядит следующим образом:

class ReadOrdersFromWebDB : InputCommandOperation
{
    public ReadOrdersFromServerA(ConnectionStringSettings connectionStringSettings)
        : base(connectionStringSettings) { }

    protected override Row CreateRowFromReader(IDataReader reader)
    {
        return Row.FromReader(reader);
    }

    protected override void PrepareCommand(IDbCommand cmd)
    {
        cmd.CommandText = "SELECT TOP 10 * FROM tblOrders WHERE Transferred = 0";
    }
}

Поскольку на этом этапе нет преобразований, моя OutputCommandOperation будет выглядеть следующим образом:

class WriteOrdersToServerB : OutputCommandOperation
{
    protected override void PrepareCommand(IDbCommand cmd, Row row)
    {
        cmd.CommandText =
@"INSERT INTO etc...........";
    }
}

Что я хочу сделать, это изменить этот процесс, чтобы также получить подробности tblOrderLine от ServerA - если это возможно, без выполнения секундного запроса к базе данных (соединение) Мне бы хотелось, чтобы в таблице tblOrderLine не было столбца «Передано», и я бы предпочел изменить InputCommand, чтобы включить соединение.

Как работает операция вставки после объединения в InputCommand? Это вообще возможно?

1 Ответ

0 голосов
/ 16 декабря 2011

Насколько я понимаю, у вас есть 2 таблицы, которые вы хотите загрузить с сервера A на сервер B и, если возможно, объединить две таблицы с сервера ServerA и снова разделить их на 2 таблицы на сервере B.

Еслиотношение между tblOrder и tblOrderLine равно 1 для многих, тогда просто забудьте о присоединении к ним.Это создаст избыточные данные, не говоря уже о том, что SELECT TOP n приведет к игнорированию некоторых элементов из tblOrderLine.Если соотношение между двумя таблицами равно 1 к 1, то это возможно, но я не уверен, что это будет более эффективно, чем индивидуальный запрос к двум таблицам.

Вы можете избежать использования флага Transferred на tblOrderLine, сохранив идентификаторы OrderID, извлеченные из tblOrder, в список, а затем запросите tblOrderLine для этих конкретных идентификаторов OrderID.

SELECT TOP 10 * 
FROM tblOrder
WHERE Transferred = 0

Сохраните найденный список OrderIDв этих данных и запросить tblOrderLine с ним.

SELECT *
FROM tblOrderLine
WHERE OrderID IN /* list of saved OrderID */
...