2010-12-14 26 views
3

我写的ETL任务的两个表,在C#中,使用犀牛ETLRhinoETL - 加入两个表的输入,写输出

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

(实施例)

tblOrder

  • 的OrderID
  • 客户名称
  • CustomerEmailAddress
  • 转移

tblOrderLine

  • 的OrderID
  • 的ProductID
  • 产品名称
  • 价格

在服务器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..........."; 
    } 
} 

我想要做的就是修改这个过程,也从ServerA获取tblOrderLine细节 - 如果可能,不需要在db上执行秒查询(join) 我非常希望避免在tblOrderLine表上有一个“Transferred”列,并且希望将InputCommand修改为包括加入..

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

回答

0

我的理解是,你有2个表,你希望从ServerA上传到ServerB,并且如果可能的话,将ServerA中的2个表合并在一起,再将它们分成ServerB中的2个表。

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

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

SELECT TOP 10 * 
FROM tblOrder 
WHERE Transferred = 0 

保存在此数据中找到的OrderID列表并用它查询tblOrderLine。

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