3

Rhino ETLを使用して、C#でETLジョブを作成しています

ServerAにデータベースがあります。これには2つのテーブルがあります。

(例)

tblOrder

  • OrderID
  • 顧客名
  • CustomerEmailAddress
  • 転送

tblOrderLine

  • OrderID
  • 製品番号
  • 商品名
  • 価格

ServerBでは、同じテーブルがあります(注文はWebからバックエンドシステムに転送されます)

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...........";
    }
}

私がやりたいのは、このプロセスを変更して、ServerAからtblOrderLineの詳細も取得することです。可能であれば、db(join)で秒クエリを実行せずに、tblOrderLineテーブルに「Transferred」列がないようにします。結合を含めるようにInputCommandを変更することをお勧めします。

InputCommandにJoinを設定した後、挿入操作はどのように機能しますか?これも可能ですか?

4

1 に答える 1

0

私の理解では、ServerA から ServerB にアップロードしたい 2 つのテーブルがあり、可能であれば、ServerA の 2 つのテーブルをまとめて、ServerB の 2 つのテーブルに再度分割します。

tblOrder と tblOrderLine の関係が 1 対多の場合は、それらを JOIN することを忘れてください。SELECT TOP n によって tblOrderLine の一部のアイテムが無視されることは言うまでもなく、冗長なデータが作成されます。2 つのテーブル間の関係が 1 対 1 の場合は可能ですが、2 つのテーブルを個別にクエリするよりも効率的かどうかはわかりません。

tblOrder から抽出した OrderID をリストに保存し、それらの特定の OrderID について tblOrderLine を照会することにより、tblOrderLine で Transferred フラグを使用することを避けることができます。

SELECT TOP 10 * 
FROM tblOrder
WHERE Transferred = 0

このデータで見つかった OrderID のリストを保存し、それを使用して tblOrderLine をクエリします。

SELECT *
FROM tblOrderLine
WHERE OrderID IN /* list of saved OrderID */
于 2011-12-16T19:35:06.773 に答える