我正在使用 Rhino ETL 在 C# 中编写 ETL 作业
我在 ServerA 上有一个数据库。这有 2 个表:
(例子)
tblOrder
- 订单号
- 客户姓名
- 客户电子邮件地址
- 转会
订单行
- 订单号
- 产品编号
- 产品名称
- 价格
在 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 后,插入操作如何工作? 这可能吗?
最佳答案
我的理解是,您有 2 个表希望从 ServerA 上传到 ServerB,如果可能,将 ServerA 中的 2 个表合并在一起,然后将它们再次拆分为 ServerB 中的 2 个表。
如果 tblOrder 和 tblOrderLine 之间的关系是 1 对多,那么就忘记连接它们吧。它会创建冗余数据,更不用说 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 */
关于c# - RhinoETL - 加入两个表作为输入,在输出时写入两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4442210/