RhinoETL - 将两个表作为输入连接,将结果写入两个表

3
我正在编写一个使用Rhino ETL的C# ETL作业。 我有一个位于ServerA上的数据库,其中包含2个表: tblOrder: - OrderID - CustomerName - CustomerEmailAddress - Transferred tblOrderLine: - OrderID - ProductID - ProductName - Price 在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的详细信息 - 如果可能的话,避免在数据库上进行第二次查询(连接)。 我很想避免在tblOrderLine表上有一个“已转移”列,并希望修改InputCommand以包括连接。 在InputCommand中添加Join后,插入操作如何工作? 这是否可行?
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

我的理解是您有两个表格希望从ServerA上传到ServerB,如果可能的话,将ServerA中的两个表格合并并再次拆分成ServerB中的两个表格。

如果tblOrder和tblOrderLine之间的关系是1对多,则简单地忘记JOIN它们。这将创建冗余数据,更不用说SELECT TOP n将导致忽略tblOrderLine中的一些项目。如果两个表格之间的关系是1对1,则可能可以,但我不确定它是否比单独查询这两个表格更有效。

您可以通过将从tblOrder提取的OrderIDs保存到列表中,然后查询那些特定的OrderIDs来避免在tblOrderLine上使用传输标志。

SELECT TOP 10 * 
FROM tblOrder
WHERE Transferred = 0

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,