两个DATATABLE 如何横向合并.

szch 2009-01-27 01:49:50
大家新年好!先祝大家牛年大吉.

两个DATATABLE 如何横向合并.
例如:
表A:
ID QTYA MONEYA
001 10 1000
002 5 300
003 3 700
表B:
ID QTYB MONEYB
001 3 300
002 1 60
004 2 1000
005 3 700
合并结果:
ID QTYA MONEYA QTYB MONEYB
001 10 1000 3 300
002 5 300 1 60
003 3 700 0 0
004 0 0 2 1000
005 0 0 3 700
因为两张表都是查询结果,不想再写入数据库再读出,有什么效率高的方法?
每张表大概十万条记录.有相同的,也有部分不同的.如何合并更快?
...全文
785 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
特别 2009-02-02
  • 打赏
  • 举报
回复
下面是DataTable.Merge 方法的示例,有缺点是相同ID没能合并,楼主再想想办法调整一下

private void button1_Click( object sender, EventArgs e )
{

//构造A表
DataTable dtA = new DataTable();

DataColumn c1 = new DataColumn( "ID", typeof( string ) );
DataColumn c2 = new DataColumn( "QTYA", typeof( int ) );
c2.DefaultValue = 0;
DataColumn c3 = new DataColumn( "MONEYA", typeof( int ) );
c3.DefaultValue = 0;

dtA.Columns.Add( c1 );
dtA.Columns.Add( c2 );
dtA.Columns.Add( c3 );

//dtA.PrimaryKey = new DataColumn[] { c1 };

//A表数据
dtA.Rows.Add( "001", 10, 1000 );
dtA.Rows.Add( "002", 5, 300 );
dtA.Rows.Add( "003", 3, 700 );

//构造B表
DataTable dtB = new DataTable();

DataColumn cc1 = new DataColumn( "ID", typeof( string ) );
DataColumn cc2 = new DataColumn( "QTYB", typeof( int ) );
cc2.DefaultValue = 0;
DataColumn cc3 = new DataColumn( "MONEYB", typeof( int ) );
cc3.DefaultValue = 0;

dtB.Columns.Add( cc1 );
dtB.Columns.Add( cc2 );
dtB.Columns.Add( cc3 );

//dtB.PrimaryKey = new DataColumn[] { cc1 };

//A表数据
dtB.Rows.Add( "001", 3, 300 );
dtB.Rows.Add( "002", 1, 60 );
dtB.Rows.Add( "004", 2, 10000 );
dtB.Rows.Add( "005", 3, 700 );

//合并
dtA.Merge( dtB, true, MissingSchemaAction.Add );

dataGridView1.DataSource = dtA;
}
特别 2009-02-02
  • 打赏
  • 举报
回复
觉得对于两个各有约十万条数据的DataTable进行合并,还不如直接操作SQL来的快
下面是SQL语句的写法

select id,SUM(QTYA) AS QTYA,SUM(MONEYA) AS MONEYA,SUM(QTYB) AS QTYB,SUM(MONEYB) AS MONEYB
FROM
(
select id,QTYA,MONEYA,0 as QTYB,0 as MONEYB
from tabA

union all

select id,0,0,QTYB, MONEYB
from tabB
) as Tab
GROUP BY ID


如果直接合并DataTable,
楼主可以参考一下MSDN中关于DataTable.Merge 方法的描述
szch 2009-02-02
  • 打赏
  • 举报
回复
dataset的Relation只能进行完全关联,但记录并不完全相同
ZJ159 2009-01-30
  • 打赏
  • 举报
回复
ding
wanghui0380 2009-01-30
  • 打赏
  • 举报
回复
我本身建议使用视图
如果实在不愿意用视图,只好使用代码修改某个datatable的column,添加一个column然后把column.DefaultValue设置成你想要滴,这中间实际可以利用一下dataset本身的Relation功能也许可以简化点代码,不过这样做也只实现了显示视图,而回写又要另外写代码完成了

如果你本身愿意继承并修改DataTable类部分功能,可以操作起来更容易些(实际上net本身提供几套强类型ORM方案都是继承并修改部分Dt,Ds类而做出来滴)
fengjian_428 2009-01-30
  • 打赏
  • 举报
回复
如果两个dt都是order by ID的话可以像下面这样写 PS:手写的现在没法测试,有问题再问我

DataTable dtResult=new DataTable();
dtResult.Coloumns.Add("ID");
dtResult.Coloumns.Add("QTYA");
dtResult.Coloumns.Add("MONEYA");
dtResult.Coloumns.Add("QTYB");
dtResult.Coloumns.Add("MONEYB");
int k = 0;
int i = 0;
int j = 0;

while(i < dtA.Rows.Count && j < dtB.Rows.Count) {
if (int.parse(dtA.Rows[i][0]) < int.parse(dtB.Rows[i][0]))
{ dtResult.Rows.Add(dtA.Rows[i][0].toString() ,dtA.Rows[i][1].toString() ,dtA.Rows[i] [2].toString(),"0","0" );
i++;
}
else if (int.parse(dtA.Rows[i][0]) == int.parse(dtB.Rows[i][0]))
{
dtResult.Rows.Add(dtA.Rows[i][0].toString() ,dtA.Rows[i][1].toString() ,dtA.Rows[i] [2].toString(),dtB.Rows[i][1].toString(),dtB.Rows[i][2].toString());
i++;
j++;
}
else
{
dtResult.Rows.Add(dtB.Rows[i][0].toString() ,"0","0",dtB.Rows[i][1].toString(),dtB.Rows[i][2].toString() );
j++;
}
}
while (i < dtA.Rows.Count)
{
dtResult.Rows.Add(dtA.Rows[i][0].toString() ,dtA.Rows[i][1].toString() ,dtA.Rows[i] [2].toString(),"0","0" );
i++;
}
while (j < dtB.Rows.Count)
{
dtResult.Rows.Add(dtB.Rows[i][0].toString() ,"0","0",dtB.Rows[i][1].toString(),dtB.Rows[i][2].toString() );
j++;
}
szch 2009-01-30
  • 打赏
  • 举报
回复
UP
szch 2009-01-28
  • 打赏
  • 举报
回复
谢谢各位的参与.
(1)由于是从数据库中查询得到的两张表,再用LEFT JOIN 需要在数据库里建临时表,这样回写的效率也不高;
(2)使用DATAVIEW对记录循环添加,但是需要过滤来判断每一条记录是否存在.
以上两种方式在数据量较大的情况下效率都不会高,所以才希望看看是否有其他更好的方式.
请继续参与和支持,谢谢!
wuyq11 2009-01-27
  • 打赏
  • 举报
回复
建立视图
select A.ID,QTYA,MONEYA,QTYB,MONEYB from A left join B on A.ID=B.ID
或先查询A,再循环查询B
king19840811 2009-01-27
  • 打赏
  • 举报
回复
select A.ID,QTYA MONEYA QTYB MONEYB from A left join B on A.ID=B.ID
冷月孤峰 2009-01-27
  • 打赏
  • 举报
回复
新建一个datatable(列:ID,QTYA,MONEYA,QTYB,MONEYB),现将表A直接插入,
然后根据ID,循环往里面插入不就行了
gs0038 2009-01-27
  • 打赏
  • 举报
回复
select A.ID,QTYA MONEYA QTYB MONEYB from B join left A on A.ID=B.ID
//如果不行把left换rigth

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧