比较来自不同表的数据并添加到第三个数据的最有效方法

时间:2016-12-28 23:35:08

标签: c# sql

问题

我有三张桌子,让我们说“表一' '表二'和'表三'。 这三个都有不同的模式,但是,表一和表二都有一个匹配的列。

表一目前是50,000行。表二是5,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#应用程序中,而不是在服务器端。

1 个答案:

答案 0 :(得分:3)

  

对于表2中的每一行,我需要检查列B是否等于表1中的列B.如果是,我需要列A值。

SELECT TableOne.ColumnB, TableTwo.ColumnB, TableOne.ColumnA
FROM TableOne
JOIN TableTwo on TableOne.ColumnB = TableTwo.ColumnB
  1. JOIN会为ColumnBTableOne提供TableTwo相等的行。
  2. LEFT JOIN会为您提供上面第1项中的所有内容以及TableOne中与之不匹配的所有行。
  3. FULL JOIN会为您提供上面的1和2以及与TableTwo不匹配的所有行。
  4. 您需要上面的第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 to SQL将为您生成SQL查询,并且将在SQL Server数据库端进行连接,因此您的应用程序不会受到惩罚。