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

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

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

【问题讨论】:

标签: c# mysql sql-server join


【解决方案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 将填充您在选择中选择的字段所在的行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-09-04
          • 1970-01-01
          • 1970-01-01
          • 2020-03-27
          相关资源
          最近更新 更多