如何将两个 DataTable 与内部连接连接在一起

Posted

技术标签:

【中文标题】如何将两个 DataTable 与内部连接连接在一起【英文标题】:How to join two DataTable together with inner join 【发布时间】:2015-08-06 09:47:45 【问题描述】:

所以我有 2 个数据表,我想以与 sql server 中的内部联接合并的相同方式将它们合并为 1 个。

一个问题是两个表中的某些字段名称相同,但值可能不同(例如定价值)。这两个表都有一个“ID”列,该列具有相同的值并且可以连接。

【问题讨论】:

使用完全限定的列名。 发布一些实际的表格描述(列、类型等),我们可以为您提供更好的帮助。 查看以下网页:code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9 【参考方案1】:

编写一个引用两个数据库中的表的 SQL SELECT 语句,使用 JOIN,为查询中的表分配别名,然后使用别名限定列引用。

并在 SELECT 列表中使用适当的表达式来返回您想要返回的结果集。

【讨论】:

【参考方案2】:
 DataTable dt1 = new DataTable();
    dt1.Columns.Add("CustID", typeof(int));
    dt1.Columns.Add("ColX", typeof(int));
    dt1.Columns.Add("ColY", typeof(int));

    DataTable dt2 = new DataTable();
    dt2.Columns.Add("CustID", typeof(int));
    dt2.Columns.Add("ColZ", typeof(int));

    for (int i = 1; i <= 5; i++)
    
        DataRow row = dt1.NewRow();
        row["CustID"] = i;
        row["ColX"] = 10 + i;
        row["ColY"] = 20 + i;
        dt1.Rows.Add(row);

        row = dt2.NewRow();
        row["CustID"] = i;
        row["ColZ"] = 30 + i;
        dt2.Rows.Add(row);
    

    var results = from table1 in dt1.AsEnumerable()
                 join table2 in dt2.AsEnumerable() on (int)table1["CustID"] equals (int)table2["CustID"]
                 select new
                 
                     CustID = (int)table1["CustID"],
                     ColX = (int)table1["ColX"],
                     ColY = (int)table1["ColY"],
                     ColZ = (int)table2["ColZ"]
                 ;
    foreach (var item in results)
    
        Console.WriteLine(String.Format("ID = 0, ColX = 1, ColY = 2, ColZ = 3", item.CustID, item.ColX, item.ColY, item.ColZ));
    
    Console.ReadLine();

// Output:
// ID = 1, ColX = 11, ColY = 21, ColZ = 31
// ID = 2, ColX = 12, ColY = 22, ColZ = 32
// ID = 3, ColX = 13, ColY = 23, ColZ = 33
// ID = 4, ColX = 14, ColY = 24, ColZ = 34
// ID = 5, ColX = 15, ColY = 25, ColZ = 35

【讨论】:

这实际上并没有给出一个新的数据表,但却是公认的答案,当已经有一个答案完全做到了这一点,并将结果存储在数据表中时。这是有道理的。【参考方案3】:

您可以这样做,假设 table1 和 table2 是您的两个数据表,而 resultTable 是您希望使用连接结果填充的数据表。 您也可以使用 union all 运算符。

【讨论】:

【参考方案4】:

编写一个引用两个数据库中的表的 SQL SELECT 语句,使用 JOIN,为查询中的表分配别名,然后使用别名限定列引用。

并在 SELECT 列表中使用适当的表达式来返回您想要返回的结果集。

要模拟“完全外部”联接,您可能需要使用带有 LEFT JOIN 的查询和带有 ant-join 的另一个查询,并将结果与​​ UNION ALL 运算符结合起来。

一旦您有一个返回所需结果的 SELECT,您就可以在 INSERT .. SELECT 语句中使用它来将结果保存到另一个表中。


除了对您要达到的目标的模糊描述之外,没有更具体的信息,我们将尽可能具体。

【讨论】:

【参考方案5】:

假设table1table2 是您的两个数据表,并且resultTable 是您希望使用连接结果填充的DataTable,您应该能够做到这一点:

var res = from dr1 in table1.AsEnumerable()
            join dr2 in table2.AsEnumerable()
              on dr1.Field<int>("ID") equals dr2.Field<int>("ID")
          select resultTable.LoadDataRow(new object[]
          
            dr1.Field<int>("ID"),
            dr1.Field<string>("column name .. "),
            ... 
            dr2.Field<string>("column from table 2 .. "),
            ...
           , false);

然后resultTable 将填充您在选择中选择的字段所在的行。

【讨论】:

以上是关于如何将两个 DataTable 与内部连接连接在一起的主要内容,如果未能解决你的问题,请参考以下文章

Android中的adb连接与多个系统

从两个通过 LINQ 连接的 DataTable 创建组合的 DataTable。 C#

如何在使用两个内部连接并将表设置为连接时在 MySQL 中使用更新语句?

如何将 rank() 与内部连接一起使用?

将游标适配器与多个表游标一起使用(内连接)

如何将不同数据上下文的表进行内部连接?[重复]