C#中两个数据表的自然联接
本文关键字:数据表 自然 两个 | 更新日期: 2023-09-27 18:20:43
我有一个包含两个表的数据集。一个被认为嵌套在另一个中。。我只想它不嵌套,只有一张表。Merge()和LINQ根本没用。
以下是主表的示例
学生id nbsp ID
--------------------
123456789;1
654987321;2
但每一个都有多行,它们在下一个表中对应
ID 第1列 Col2等
----------------------
1 事实1 事实2
1 事实3 事实4
2 事实5 事实6
我想把它们组合起来,这样它们就会看起来像这样。。。
学生id nbsp 第1列 第2列
-------------------------------
123456789 事实1 nbsp;事实2
123456789 事实3 nbsp;事实4
654987321 事实5 nbsp;fact6
每次我尝试合并都不起作用,我都会收到一个错误,即我无法复制"ID"主键,并且由于合并是基于主键的(我相信),我无法删除它。
我不能使用LINQ,因为我想让它成为通用的,这样第二个表就可以有任意数量的列,而我无法让select为此工作。
更新:我的解决方案我最终将第二个表克隆到了一个新的数据表中。然后添加一个名为"student id"的列并删除id列。我循环浏览主表的行,找到并将它们与第二个表中的行关联。。。将数组中的所有数据组合在一起,并在最终表中创建一行。
LINQ并没有你建议的那么糟糕。您可以只使用一个包含两个DataRow的匿名类型:
var result = from t1 in table1.AsEnumerable()
join t2 in table2.AsEnumerable() on (int)t1["ID"] equals (int)t2["ID"]
select new
{
Student = t1,
Facts = t2
};
foreach(var s in result)
Console.WriteLine("{0} {1} {2}", s.Student["student-id"], s.Facts["Col1"], s.Facts["Col2"]);
这样,您就不会在输出中包含特定的列,因此您可以在事后访问它们。
话虽如此,另一位发帖人建议使用透视表可能是一个更好的方向。
让我们在SQL中尝试一下。
设,第一个表=表1,第二个表=表格2
SQL:
Select
X.student-id,Y.Col1,Y.Col2
From Table1 As X Inner Join Table2 As Y On Y.ID=X.ID
我认为如果你在SQL中尝试它,它很容易做到!!!
听起来您需要的是一个Pivot表。
这将基本上允许您按照自己的意愿显示数据。
以下是的几个教程/项目
http://www.codeproject.com/Articles/25167/Simple-Advanced-Pivots-with-C-and-ASP-NEThttp://www.codeproject.com/Articles/46486/Pivoting-DataTable-Simplified
更新
您可能会发现自己更好地将MSSQL中的"pivot"部分作为存储过程,然后用调用此存储过程的结果填充数据表。这个例子是一个伟大的开始块
http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx