我正在使用C#,并尝试在代码中对多个数据表进行联合。
Table 1
ID | Value | Value2
-----------------
1 | Tom | Null
-----------------
2 | John | Null
-----------------
...
Table 2
ID | Value | Value2
-----------------
1 | Null | Susie
-----------------
2 | Null | Kim
-----------------
...并且,我希望结果表如下所示
TableResult
ID | Value | Value2
-----------------
1 | Tom | Susie
-----------------
2 | John | Kim
-----------------
...有没有办法让我这么做?
发布于 2011-04-09 02:31:42
我不确定您在C#中使用的是什么数据结构,但是您可以在您的数据库中这样做:
SELECT COALESCE(Table1.ID, Table2.ID) AS ID
,COALESCE(Table1.Value, Table2.Value) AS Value
,COALESCE(Table1.Value2, Table2.Value2) AS Value2
FROM Table1
FULL OUTER JOIN Table2
ON Table1.ID = Table2.ID我在这里选择了一个完整的外连接,这样任何一方都可能缺少项(我一般认为大多数人在他们的职业生涯中大约一年都会使用一个完整的外连接),也可以随意选择始终选取Table1中的值(如果它首先存在),这样Table2就不会覆盖Table1中的某些东西。
因此,作为FOJ如何工作的示例:
Table 1
1,A,NULL
2,B,X
3,NULL,Y
4,D,Z
Table 2
1,NULL,P
2,NULL,Q
3,C,NULL
5,E,W
Output:
1,A,P
2,B,X
3,C,Y
4,D,Z
5,E,W发布于 2011-04-09 02:34:52
如果它们已经在DataTables中,您可以将它们加载到另一个表中:
DataTable unionTable = new DataTable();
unionTable.Load(table1.CreateDataReader());
unionTable.Load(table2.CreateDataReader());我认为前面提到的在服务器端做这件事的想法是一个更好的方法……
发布于 2011-04-09 02:41:40
在Linq中实现这一点的另一种方法
//假设您有两个表(填充数据库中的变量) IQueryable tab1 = new List().AsQueryable();IQueryable tab2 = new List().AsQueryable();
//您可以这样创建结果表var resultTable = tab1.Select(t1 => new Table1 { t1.ID,t1.Value,tab2.Any(t2 => t2.ID == t1.ID)?)tab2.First(t2 => t2.ID == t1.ID).Value : null });
https://stackoverflow.com/questions/5599292
复制相似问题