问题
我有三张桌子,让我们说“表一' '表二'和'表三'。 这三个都有不同的模式,但是,表一和表二都有一个匹配的列。
表一目前是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#应用程序中,而不是在服务器端。
答案 0 :(得分:3)
对于表2中的每一行,我需要检查列B是否等于表1中的列B.如果是,我需要列A值。
SELECT TableOne.ColumnB, TableTwo.ColumnB, TableOne.ColumnA
FROM TableOne
JOIN TableTwo on TableOne.ColumnB = TableTwo.ColumnB
JOIN
会为ColumnB
和TableOne
提供TableTwo
相等的行。 LEFT JOIN
会为您提供上面第1项中的所有内容以及TableOne
中与之不匹配的所有行。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 to SQL将为您生成SQL查询,并且将在SQL Server数据库端进行连接,因此您的应用程序不会受到惩罚。