2016-12-28 64 views
2

的問題比較來自不同表中的數據,並添加到第三

我有三個表最有效的方法,可以說「表一」「表二」和「三表」。 所有三個都有不同的模式,但是,表一和表二有一個匹配列。

表一目前是50,000行。表二是五千,但會增加。 對於表2中的每一行,我需要檢查列B是否等於表1中的列B.如果是我需要列A值。

我所做的

最初,當這個表格是沒有這麼大我有一個嵌套的循環檢查值

foreach(DataRow r in TableOne) 
{ 
    foreach(DataRow s in TableTwo) 
    { 
    if(r.ItemArray[1] == s.ItemArray[1]) 
     doSomethingWith(r.ItemArray[0]); 
    } 
} 

不過,我覺得這隻會成爲隨着桌子尺寸的增加,大量追索權問題。

我認爲下面的,但我不知道是否有未來證明自己進一步更好的辦法:

SELECT TableOne.ColumnB, TableTwo.ColumnB, TableOne.ColumnA 
FROM TableOne 
LEFT JOIN ColumnA on TableOne.ColumnB = TableTwo.ColumnB 

編輯 更清楚 - 這是發生在C#應用程序,而不是服務器端。

+0

你在用linq嗎?另外,讓我知道你正在使用的是哪個sql版本 –

+0

1.你在SQL Server而不是c#中做這個很好嗎? 2.什麼是DBMS?因爲sql不是.. – DarkKnight

+0

另外,如果你直接在SQL端處理這一點,而不是在數據層和業務邏輯之間進行往返,那將會很好。 –

回答

3

對於表2中的每一行,我需要檢查列B是否永遠等於表1中的列B.如果是我需要列A值。

SELECT TableOne.ColumnB, TableTwo.ColumnB, TableOne.ColumnA 
FROM TableOne 
JOIN TableTwo on TableOne.ColumnB = TableTwo.ColumnB 
  1. JOIN會給你那些行,其中ColumnB在兩個TableOneTableTwo相等。
  2. LEFT JOIN將爲您提供上述第1項中的所有內容以及所有與TableOne不匹配的行。
  3. FULL JOIN會給你上面的1和2加上所有與TableTwo不匹配的行。

您需要上面的第1項。

如果有很多行,您不希望在應用程序的循環中執行此操作,因爲要這樣做,您需要將數據庫中的所有數據拖入應用程序內存,然後執行過濾。如果你在TableOne中有500行,在TableTwo中有500行,你可以將1000行記錄到內存中。如果找不到匹配項,您將所有這些行都拉出來,原因不明。如果你在數據庫端執行它,它將返回0行。

你也可以做到這一點使用LINQ to SQL:

from one in TableOne 
join two in TableTwo on one.ColumnB equals two.ColumnB 
select new { OneColumnB = one.ColumnB, TwoColumnB = two.ColumnB, ColumnA = one.ColumnA }; 

這LINQ到SQL會爲您生成SQL查詢,並會出現在SQL Server數據庫端的加入使您的應用程序不會拿罰款。

+0

確保ColumnB爲這兩個表建立索引。另外,您可能希望創建一個視圖或Store Proc以便從C#中調用以提高查詢效率。 – PhilC

+0

如果ColumnB未被編入索引,會是什麼情況? – Lift

+0

看到你的編輯 - 謝謝你對整個左連接的解釋。 – Lift

相關問題