2010-12-14 60 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 */