2011-04-08 48 views
2

我正在使用C#並試圖在代碼中的多個數據表上進行聯合。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 
-----------------  
... 

有沒有一種方法,我會這樣?

+2

這是在SQL數據庫中嗎?您是使用LINQ-2-SQL還是需要知道如何在常規SQL中執行此操作?順便說一句:你所描述的是所謂的左加入,而不是工會。 – 2011-04-08 18:31:17

+1

你現在有什麼數據結構?一個集合?通常,這將在數據庫層完成,而不是C#層;如果你使用的是LINQ,那麼它就是一個不同的故事,就像它在C#層完成的那樣,然後告訴數據庫層進行聯合。 – Nate 2011-04-08 18:31:47

+0

我正在讀這篇文章,這聽起來像是你想合併這兩張表。如果是這樣,發生衝突時會發生什麼情況(例如,如果表1中的值2不爲空)? – 2011-04-08 18:33:37

回答

5

我不知道什麼數據結構使用的是在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 

我選擇了FULL OUTER JOIN這裏,這樣的項目可以在任何一方丟失(我通常希望大多數人在職業生涯中每年會使用一次FULL OUTER JOIN),以及任意選擇總是選擇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 
+0

這不會給你湯姆|蘇西,湯姆|金,約翰|蘇西,約翰|金?從這個例子我想你想做一個內部連接,而不是外部連接。 – 2011-04-08 18:34:19

+0

@Joel C,我選擇了一個完整的外連接,因爲這個問題看起來不夠明確。我會在我的回答中發表更多內容。 – 2011-04-08 18:38:58

0

如果他們在數據表是已經,你可以將它們加載到另一個表:

DataTable unionTable = new DataTable(); 
unionTable.Load(table1.CreateDataReader()); 
unionTable.Load(table2.CreateDataReader()); 

我覺得做的概念它服務器端如前所述是一個很好的辦法,雖然...

0

另一種方式在Linq做到這一點

//假設你有兩個表(填充來自dababase的變量) 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});