两个DataTable关联查询(inner join、left join)C#代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Data; namespace ConsoleApplication1
{
/// <summary>
/// 在返回的table处大断点查看结果
/// </summary>
class Program
{
static void Main(string[] args)
{
CreatTable();
} /// <summary>
/// 创建两个测试表
/// </summary>
public static void CreatTable()
{
//定义数据结构
DataTable Ks = new DataTable("客商"); //左表or主表
DataColumn dcID = new DataColumn("ID", System.Type.GetType("System.Int32"));
DataColumn dcNa = new DataColumn("客商名称", System.Type.GetType("System.String"));
Ks.Columns.Add(dcID);
Ks.Columns.Add(dcNa); DataTable Dj = new DataTable("订单");//右表or子表
DataColumn dcID2 = new DataColumn("ID", System.Type.GetType("System.Int32"));
DataColumn dcNu = new DataColumn("订单数量", System.Type.GetType("System.Int32"));
Dj.Columns.Add(dcID2);
Dj.Columns.Add(dcNu); //左表数据
DataRow KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "张三";
Ks.Rows.Add(KsDt); KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "李四";
Ks.Rows.Add(KsDt); KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "王武";
Ks.Rows.Add(KsDt); KsDt = Ks.NewRow();
KsDt["ID"] = ;
KsDt["客商名称"] = "赵柳";
Ks.Rows.Add(KsDt); //右表数据
KsDt = Dj.NewRow();
KsDt["ID"] = ;
KsDt["订单数量"] = ;
Dj.Rows.Add(KsDt); //KsDt = Dj.NewRow();
//KsDt["ID"] = 11;
//KsDt["订单数量"] = 12;
//Dj.Rows.Add(KsDt); //KsDt = Dj.NewRow();
//KsDt["ID"] = 12;
//KsDt["订单数量"] = 16;
//Dj.Rows.Add(KsDt); //KsDt = Dj.NewRow();
//KsDt["ID"] = 13;
//KsDt["订单数量"] = 30;
//Dj.Rows.Add(KsDt); KsDt = Dj.NewRow();
KsDt["ID"] = ;
KsDt["订单数量"] = ;
Dj.Rows.Add(KsDt); KsDt = Dj.NewRow();
KsDt["ID"] = ;
KsDt["订单数量"] = ;
Dj.Rows.Add(KsDt); /*********************调用******************************************/
//
Join(Ks, Dj, new DataColumn[] { Ks.Columns["ID"] }, new DataColumn[] { Dj.Columns["ID"] });
//重载1
Join(Ks, Dj, Ks.Columns["ID"], Dj.Columns["ID"]);
//重载2
Join(Ks, Dj, "ID", "ID"); /*********************调用结束**************************************/
} /// <summary>
/// 建立两内存表的链接
/// </summary>
/// <param name="dt1">左表(主表)</param>
/// <param name="dt2">右表</param>
/// <param name="FJC">左表中关联的字段名(字符串)</param>
/// <param name="SJC">右表中关联的字段名(字符串)</param>
/// <returns></returns>
public static DataTable Join(DataTable dt1, DataTable dt2, DataColumn[] FJC, DataColumn[] SJC)
{
//创建一个新的DataTable
DataTable table = new DataTable("Join"); // Use a DataSet to leverage DataRelation
using (DataSet ds = new DataSet())
{
//把DataTable Copy到DataSet中
ds.Tables.AddRange(new DataTable[] { dt1.Copy(), dt2.Copy() }); DataColumn[] First_columns = new DataColumn[FJC.Length];
for (int i = ; i < First_columns.Length; i++)
{
First_columns[i] = ds.Tables[].Columns[FJC[i].ColumnName];
} DataColumn[] Second_columns = new DataColumn[SJC.Length];
for (int i = ; i < Second_columns.Length; i++)
{
Second_columns[i] = ds.Tables[].Columns[SJC[i].ColumnName];
} //创建关联
DataRelation r = new DataRelation(string.Empty, First_columns, Second_columns, false);
ds.Relations.Add(r); //为关联表创建列
for (int i = ; i < dt1.Columns.Count; i++)
{
table.Columns.Add(dt1.Columns[i].ColumnName, dt1.Columns[i].DataType);
} for (int i = ; i < dt2.Columns.Count; i++)
{
//看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second
if (!table.Columns.Contains(dt2.Columns[i].ColumnName))
table.Columns.Add(dt2.Columns[i].ColumnName, dt2.Columns[i].DataType);
else
table.Columns.Add(dt2.Columns[i].ColumnName + "_Second", dt2.Columns[i].DataType);
} table.BeginLoadData();
int itable2Colomns = ds.Tables[].Rows[].ItemArray.Length;
foreach (DataRow firstrow in ds.Tables[].Rows)
{
//得到行的数据
DataRow[] childrows = firstrow.GetChildRows(r);//第二个表关联的行
if (childrows != null && childrows.Length > )
{
object[] parentarray = firstrow.ItemArray;
foreach (DataRow secondrow in childrows)
{
object[] secondarray = secondrow.ItemArray;
object[] joinarray = new object[parentarray.Length + secondarray.Length];
Array.Copy(parentarray, , joinarray, , parentarray.Length);
Array.Copy(secondarray, , joinarray, parentarray.Length, secondarray.Length);
table.LoadDataRow(joinarray, true);
} }
else//如果有外连接(Left Join)添加这部分代码
{
object[] table1array = firstrow.ItemArray;//Table1
object[] table2array = new object[itable2Colomns];
object[] joinarray = new object[table1array.Length + itable2Colomns];
Array.Copy(table1array, , joinarray, , table1array.Length);
Array.Copy(table2array, , joinarray, table1array.Length, itable2Colomns);
table.LoadDataRow(joinarray, true);
DataColumn[] dc = new DataColumn[];
dc[] = new DataColumn("");
}
}
table.EndLoadData();
}
return table;//***在此处打断点,程序运行后点击查看即可观察到结果
} /// <summary>
/// 重载1
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
/// <param name="FJC"></param>
/// <param name="SJC"></param>
/// <returns></returns>
public static DataTable Join(DataTable dt1, DataTable dt2, DataColumn FJC, DataColumn SJC)
{
return Join(dt1, dt2, new DataColumn[] { FJC }, new DataColumn[] { SJC });
} /// <summary>
/// 重载2
/// </summary>
/// <param name="dt1"></param>
/// <param name="dt2"></param>
/// <param name="FJC"></param>
/// <param name="SJC"></param>
/// <returns></returns>
public static DataTable Join(DataTable dt1, DataTable dt2, string FJC, string SJC)
{
return Join(dt1, dt2, new DataColumn[] { dt1.Columns[FJC] }, new DataColumn[] { dt1.Columns[SJC] });
} }
}
上面运行的结果:
这是通过网上整理的,适合处理两个服务器上的数据关联。欢迎留言。
两个DataTable关联查询(inner join、left join)C#代码的更多相关文章
- Mongoose 两个表关联查询aggregate 以及 Mongoose中获取ObjectId
Mongoose 两个表关联查询aggregate 通常两个表关联查询的时候,是一种一对多的关系,比如订单与订单详情就是一对多的关系,一个订单下面有多个商品 数据模拟 首先我们先将数据模拟出来,先选择 ...
- mybatis 使用接口增删改查和两表一对一关联查询
导包 总配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...
- oracle库两个表关联查询时用 count 报错【我】
oracle数据库,需要对两个表进行关联查询(根据两个字段),结果发现关联后不能改为 count 获取数量,报错如下: 同样的sql换到另外一个数据库就可以(只是因为数据量在千万级,所以很慢,用时40 ...
- 175. Combine Two Tables【LeetCode】-LEFT JON 和RIGHT JOIN,两张表关联查询-java -sql入门
Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...
- Yii2中多表关联查询(with、join、joinwith)
表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name custome ...
- 关联查询总结,left join 和 inner join 区别和优化
left join 是做左外关联,主表内容都会显示:符合关联条件的附表内容才会显示出来. inner join 是内关联,没有主表附表的概念:两个表中,同时符合关联条件的数据才会显示出来. left ...
- Oracle关联查询关于left/right join的那点事
/*题外话 --更改foreign key约束定义引用行(delete cascade/delete set null/delete no action),默认delete on action--引用 ...
- 2016.1.22 利用LINQ实现DataSet内多张DataTable关联查询操作(目前未发现太大价值)
DataSet ds = new DataSet(); DataTable t1 = DBFactorySingleton.GetInstance().Factory.GetDataTable(sql ...
- mariadb索引、视图、关联查询、备份恢复、外键
连接查询(两张表关联查询) 在sql语句中,- - 代表注释 内关联查询(查询两张表的交集) select * from 表1 inner join 表2 on 表1.id=表2.id(此处id是表1 ...
随机推荐
- learning docker steps(3) ----- docker services 初次体验
参考:https://docs.docker.com/get-started/part3/#docker-composeyml docker 的 service样例, 我们可以理解成是一个本地负载均衡 ...
- dom4j解析xml报错:Nested exception: org.xml.sax.SAXParseException: White space is required between the processing instruction target and data.
采用dom4j方式解析string类型的xml xml: String string="<?xmlversion=\"1.0\" encoding=\ ...
- Dash:程序员的好帮手(转载)
作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作, ...
- DevExpress WPF入门指南:绑定编辑器对话框
绑定编辑器对话框 每个Smart Tag属性既可以设置也可以绑定.如下图所示,点击绑定按钮打开绑定对话框: 如果属性已经绑定,binging按钮会显示为黄色,绑定的文本会显示在相应的属性行. 绑定So ...
- 项目使用Nuget,然后SVN checkout后显示缺少引用
如下图黄色叹号: 解决方案: 1.先生成解决方案 2.执行如下: 这时候Nuget是存在了,但是还是显示缺少引用: 那么最后一步, 输入 :Update-Package -reinstall
- 解决tensorflow的"Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA Using TensorFlow backend."警告问题
问题描述 程序开始运行的时候报出警告:I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructio ...
- 【转载】Java Web的web.xml文件作用及基本配置
其实web.xml就是asp.net的web.config一个道理. 说明: 一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的. web.xml文件是用来 ...
- Java Iterator的一般用法
Iterator(迭代器) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通常被称为“轻量级”对象,因为创建它的代价小. Java中的I ...
- 【机器学习算法】Boostrapping算法
参考 1.AdaBoost从原理到实现: 完
- [LeetCode&Python] Problem 884. Uncommon Words from Two Sentences
We are given two sentences A and B. (A sentence is a string of space separated words. Each word co ...