两个同样结构的表,其中部分数据行相同,如何求交集呢?
只能一条一条取出来比对么?比如用select 其中的一行的某个字段值等于另一个表的某行的同字段值的话,
把这一行选出来。

解决方案 »

  1.   

    在sql里面控制,然后fill 到DataSet,DataTable
      

  2.   

    嘿嘿,想到一个邪恶的方法,利用
    try{}catch{}把一个表里的行向另一个表里插,插不进的就是交集数据,
    在catch里面写到交集表里面。
      

  3.   


    楼主的思路也不错啊
    用一个for循环,循环一个表
    如果是sql的话,用if exists判断会快点
    如果exists就add
    else continue
    这个效率上不会太差吧期待高手给更好的答案
      

  4.   

    参考这个
    http://weblogs.sqlteam.com/davidm/archive/2004/01/21/753.aspx目前想不到更好的
      

  5.   

    不知道是否可行,你可以将数据库中的每条数据看成一个类对象,将两个表的所有对象都添加到两个LIST中,循环遍历对象,看那些对象相等就取出来。
      

  6.   

    我的思路是先把那张源数据库合到dsTempValue这个表里,然后新建个空表.在源数据库表里做每行每列循环,把每行每列的值合并成一个字符串加到List里,然后在空表里添加行的时候判断list里是否有相同数据,如果有则不添加.这样就不会有重复数据了
    DataTable dtTarget = new DataTable();
    List<string> lsKeys = new List<string>();
    foreach (DataRow row in dsTempValue.Tables[1].Rows)//循环每行
                         {                         drTarget = dtTarget.NewRow();
                             string key = "";
                             foreach (DataColumn col in dsTempValue.Tables[1].Columns)//循环每列
                             {                             
                                     key += row[col.ColumnName].ToString();
                                     drTarget[col.ColumnName] = row[col.ColumnName];
                              
                             }
                             if (!lsKeys.Contains(key))//判断是否已经有相同数据
                                {
                                 dtTarget.Rows.Add(drTarget);
                             }
                             lsKeys.Add(key);
                         }
      

  7.   


    写SQL语句啊select a.*,b.* from TableA left join TableB on a.相同的字段=b.相同的字段就可以实现你要的效果了,你试试!参考
      

  8.   

    说实话,不管你在两次循环里面作什么,都效率不高。
    楼主想要的就是一个时间复杂度更低的方法吧。
    如果楼主的DataTable是个有主键的DataTable,可以尝试一下这个。foreach (DataRow dr in data1.Rows) {
     try {
        data2.ImportRow(dr);
     } catch {
        data3.ImportRow(dr);
     }
    }
      

  9.   

    用LINQ搞定
    dataTable.AsEnumerable().Intersect(dataTable2.AsEnumerable(), DataRowComparer.Default)
    using System;
    using System.Data;
    using System.Linq;namespace ConsoleApplication1
    {
        internal class Program
        {
            private static void Main()
            {
                var dataTable = new DataTable();
                dataTable.Columns.Add("A");
                dataTable.Columns.Add("B");
                dataTable.Columns.Add("C");
                dataTable.Rows.Add("1", "2", "3");
                dataTable.Rows.Add("1", "2", "4");
                dataTable.Rows.Add("2", "2", "3");
                dataTable.Rows.Add("5", "2", "1");
                dataTable.AcceptChanges();            var dataTable2 = new DataTable();
                dataTable2.Columns.Add("A");
                dataTable2.Columns.Add("B");
                dataTable2.Columns.Add("C");
                dataTable2.Rows.Add("1", "2", "3");
                dataTable2.Rows.Add("1", "2", "4");
                dataTable2.Rows.Add("2", "2", "3");
                dataTable2.Rows.Add("5", "2", "1");
                dataTable2.AcceptChanges();            Console.WriteLine("A\tB\tC");
                foreach (
                    DataRow dataRow in
                        dataTable.AsEnumerable().Intersect(dataTable2.AsEnumerable(), DataRowComparer.Default))
                {
                    Console.WriteLine(dataRow[0] + "\t" + dataRow[1] + "\t" + dataRow[2]);
                }            Console.ReadLine();
            }
        }
    }
      

  10.   

    //首先要添加System.Data.DataSetExtensions;
    DataSet ds = new DataSet();
    ds.Locale = CultureInfo.InvariantCulture;
    FillDataSet(ds);DataTable contactTable = ds.Tables["Contact"];// Create two tables.
    IEnumerable<DataRow> query1 = from contact in contactTable.AsEnumerable()
                                  where contact.Field<string>("Title") == "Ms."
                                  select contact;IEnumerable<DataRow> query2 = from contact in contactTable.AsEnumerable()
                                  where contact.Field<string>("FirstName") == "Sandra"
                                  select contact;
    DataTable contacts1 = query1.CopyToDataTable();
    DataTable contacts2 = query2.CopyToDataTable();// Find the intersection of the two tables. 求交集用 Intersect/Union(并集)/Except(差集)
    var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(),
                                                        DataRowComparer.Default);Console.WriteLine("Intersection of contacts tables");
    foreach (DataRow row in contacts)
    {
        Console.WriteLine("Id: {0} {1} {2} {3}",
            row["ContactID"], row["Title"], row["FirstName"], row["LastName"]);
    }
    DbHelperSQL.connectionString = strSiteConnection;
    DataTable dtblSiteTable = DbHelperSQL.TQuery("Select * From " + strTableName);
    IEnumerable<DataRow> querySite = from contact in dtblSiteTable.AsEnumerable() select contact;DbHelperSQL.connectionString = strMainConnection;
    DataTable dtblMainTable = DbHelperSQL.TQuery("Select * From " + strTableName);
    IEnumerable<DataRow> queryMain = from contact in dtblMainTable.AsEnumerable() select contact;var EnumerableExcept = querySite.CopyToDataTable().AsEnumerable().Except(queryMain.CopyToDataTable().AsEnumerable(), DataRowComparer.Default);
     
    DataTable dtblExcept = EnumerableExcept.CopyToDataTable();  //dtblExcept 即为差异的数据表摘抄自:http://www.cnblogs.com/zhangpengshou/archive/2010/06/30/1768384.html