【问题标题】:How to join multiple tables into one如何将多个表合并为一个
【发布时间】:2012-09-25 10:43:58
【问题描述】:

如何将多个表合并为一个?

我有 3 个列名的数据表:Test 1, Test 2 and Test3

数据表有 3 行带有值。

我希望它们在一个数据表中,如下例所示

TEST 1  |  TEST2  |  TEST 3

我尝试了合并功能dt1.merge(dt2),但它为每列添加了额外的 3 行。

该表适用于DataGridView

这是我如何从数据库中检索表的代码示例。

            string queryStatusTest =
               "SELECT status AS 'uppgift " + t +"' FROM b_personuppgift
                        WHERE uppgiftid IN(SELECT uppgiftid FROM b_uppgift
                                                   WHERE kursid = 'ABC123') "
                  + "AND uppgiftid=" + t + " ORDER BY uppgiftid";
            DataTable dTest = dataBase.Select(queryStatusTest);

database.Select() 函数只返回一个表。

【问题讨论】:

  • 你有 3 个不同的数据库或 1 个数据库有 3 个表作为测试 1、测试 2 和测试 3??
  • 我有 1 个数据库,这些表来自 SQL 查询,我现在更新了我的问题。抱歉不清楚。
  • 您需要 JOIN 还是 UNION?
  • 为什么 Merge 方法不起作用? 它为每列增加了 3 行。 不是您所期望的吗?您的预期结果是什么?
  • 对不起,我需要一个 UNION,只能通过 SQL 查询来完成吗?或者是否可以使用我的 3 DataTable 在 csharp 中进行一些编码。

标签: c# sql database


【解决方案1】:

假设 3 列类型为字符串:

var mergeTable = dt1.AsEnumerable()
     .Concat(dt2.AsEnumerable())
     .Concat(dt3.AsEnumerable())
     .GroupBy(row => new { 
                        Test1 = row.Field<string>("Test1")
                        Test2 = row.Field<string>("Test2") 
                        Test3 = row.Field<string>("Test3") 
                        })

     .Select(g => g.First())
     .CopyToDataTable();

【讨论】:

  • 我不明白“row”和“g”变量的来源。
  • 它是LINQ lambda expression 的一部分。 “行”表示当前处理的元素,“g”是当前处理的组。它们可以重命名。
  • 它说列'Test2'不属于表,但我很确定dt2上的列名是Test2。
  • @user1693991: Test2 不属于 dt1 和 dt3?
【解决方案2】:

我猜你说 database 的意思是 table。您可以使用以下语句将所有 3 个表中的数据插入到一个表中:

INSERT INTO table_all(column1,column2,column3) 
VALUES( 
  (SELECT column1 FROM test1),
  (SELECT column1 FROM test2),
  (SELECT column1 FROM test3),
)

【讨论】:

  • 为什么?他提到他想要一个数据库中的数据(嗯..真的是表),他试图通过合并来实现这一点。视图应该是只读的。
  • 因为他很可能只希望显示它们而不是创建副本。
  • 尽管后来很清楚用户只想显示数据,但我不会为这么简单的事情使用视图...
【解决方案3】:

此问题最常见的原因是您没有在 DataTables 上设置主键。 Merge 方法使用主键来匹配行。

MSDN 中的Merge method documentation 指出:

将新的源 DataTable 合并到目标时,任何源行 DataRowState 值为 Unchanged、Modified 或 Deleted,是 匹配到具有相同主键值的目标行。源行 具有已添加 DataRowState 值的新目标行与 与新源行相同的主键值。

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 2021-06-02
    • 2010-10-06
    • 2012-02-03
    • 2020-07-19
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多