none
关于数据合并的问题 RRS feed

  • 问题

  • 我现在有二张结构一样的datatable
    比如有这样几列   A,B,C,D

    第一张表里面有             第二张表里面
    A,B,C,D                       A,B,C,D
    1 2  3  4                      5  4 7 9
    5     7    
    6  3     5

    意思就是第二张表是第一张表的补充,有什么办法使第一张表里面少的数据从第二张表里面去读了补充
    如果用循环我是可以一条一条去比较补充,如果二张表数据一多,这样效率好像差了一点
    用Merge嘛就把二张表合起来,它又不会自动去补充第一张表里的空缺。还有什么效率高一点的算法嘛?

    2010年3月26日 2:44

答案

  • 关键是你具体需要自己做。

    比如上面两个表 A 字段都有记录 5,采用 Merge 可能会有两种结果。

    1 A 字段是主键:Merge 后重复的记录只会保留 B 表的。

    2 表没有主键:重复的记录都会保留。

    如果你是想将主键相同的记录求和,这里可以通过遍历数据表的方式实现。或者你去掉主键合并后使用 DataTable 的 Compute 或 Linq 查。


    知识改变命运,奋斗成就人生!
    2010年3月26日 5:08
    版主
  • 如果可以用游标的话,你可以用两个游标来同时按主键排序读两张表, 每次循环推进主键值小的游标,主键相同的话更新。效率是O(n)。 不过游标的性能差,若操作不频繁,应该还行


    Mog Liang
    2010年3月30日 8:05

全部回复

  • 用 Merge 嘛,你说的空缺可以用排序的方式解决。
    知识改变命运,奋斗成就人生!
    2010年3月26日 5:01
    版主
  • 问题是如果用merge的话,就和出现重复的行,我想用linq做一个联合查询

    2010年3月26日 5:03
  • 关键是你具体需要自己做。

    比如上面两个表 A 字段都有记录 5,采用 Merge 可能会有两种结果。

    1 A 字段是主键:Merge 后重复的记录只会保留 B 表的。

    2 表没有主键:重复的记录都会保留。

    如果你是想将主键相同的记录求和,这里可以通过遍历数据表的方式实现。或者你去掉主键合并后使用 DataTable 的 Compute 或 Linq 查。


    知识改变命运,奋斗成就人生!
    2010年3月26日 5:08
    版主
  • 我可以用A,C做外关键字来联合另外一张表来查询

              var temp = from q in first_table.AsEnumerable()
                          join w in second_table.AsEnumerable()
                          on (q.a equals w.a)
                          where q[3]==""
                          select q;

    我还想写一个q.c=w.c但是这个条件在linq里面怎么写,我在数据库里面到是可以做这个二个关键字查询的

    谢谢~

    2010年3月26日 5:10
  • 使用 Concat 嘛,与 SQL 中 union all 一样。
    知识改变命运,奋斗成就人生!
    2010年3月26日 5:14
    版主
  • 不熟悉这个语法

     on (q.a equals w.a)

    on这里不能写多个条件的嘛?

    • 已标记为答案 cpp_1 2010年3月31日 5:12
    • 取消答案标记 cpp_1 2010年3月31日 5:12
    2010年3月26日 5:28
  • 如果可以用游标的话,你可以用两个游标来同时按主键排序读两张表, 每次循环推进主键值小的游标,主键相同的话更新。效率是O(n)。 不过游标的性能差,若操作不频繁,应该还行


    Mog Liang
    2010年3月30日 8:05