3

我正在使用 Rhino ETL 在 c# 中编写 ETL 作业

我在 ServerA 上有一个数据库。这有 2 个表:

(例子)

订单

  • 订单编号
  • 顾客姓名
  • 客户电子邮件地址
  • 转移

订单行

  • 订单编号
  • 产品编号
  • 产品名称
  • 价格

在 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 进行秒查询(加入)我很想避免在 tblOrderLine 表上有一个“Transferred”列,并且更愿意修改 InputCommand 以包含一个连接..

在 InputCommand 中加入 Join 后插入操作如何工作?这甚至可能吗?

4

1 回答 1

0

我的理解是,您有 2 个表要从 ServerA 上传到 ServerB,如果可能,将 ServerA 中的 2 个表合并在一起,然后将它们再次拆分为 ServerB 中的 2 个表。

如果 tblOrder 和 tblOrderLine 之间的关系是一对多,那么只需忘记加入它们。它将创建冗余数据,更不用说 SELECT TOP n 会导致 tblOrderLine 中的某些项目被忽略。如果 2 个表之间的关系是 1 比 1,那么这是可能的,但我不确定它是否比单独查询 2 个表更有效。

您可以避免在 tblOrderLine 上使用 Transferred 标志,方法是将您从 tblOrder 提取的 OrderID 保存到一个列表中,然后在 tblOrderLine 中查询那些特定的 OrderID。

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 回答