实现两个DataTable的联合查询
如方法一描述:将子表的数组追加到主表数组的下面。从而实现类似于视图(单表)的效果。
那么Left Join(Inner Join)和Right Join(Outer Join) 将如何实现呢?
明天仔细考虑下,看看有没有办法。
不用任何sql语句的
方法一:
public DataTable Join(DataTable First, DataTable Second, 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[] { First.Copy(), Second.Copy() });
DataColumn[] parentcolumns = new DataColumn[FJC.Length];
for (int i = ; i < parentcolumns.Length; i++)
{
parentcolumns[i] = ds.Tables[].Columns[FJC[i].ColumnName];
} DataColumn[] childcolumns = new DataColumn[SJC.Length]; for (int i = ; i < childcolumns.Length; i++)
{
childcolumns[i] = ds.Tables[].Columns[SJC[i].ColumnName];
} //创建关联
DataRelation r = new DataRelation(string.Empty, parentcolumns, childcolumns, false);
ds.Relations.Add(r); //为关联表创建列
for (int i = ; i < First.Columns.Count; i++)
{
table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
} for (int i = ; i < Second.Columns.Count; i++)
{
//看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second
if (!table.Columns.Contains(Second.Columns[i].ColumnName))
table.Columns.Add(Second.Columns[i].ColumnName, Second.Columns[i].DataType);
else
table.Columns.Add(Second.Columns[i].ColumnName + "_Second", Second.Columns[i].DataType);
} table.BeginLoadData();
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);
}
}
}
table.EndLoadData();
}
return table;
}
方法二:
该方法更多体现的是两张表的合并
/// <param name="dt1">要合并的表一</param>
/// <param name="dt2">要合并的表二</param>
/// <param name="KeyColName">dt1与dt2联系的关键列名 </param> public DataTable MergeDataTable(DataTable dt1, DataTable dt2, String KeyColName)
{
//定义临时变量
DataTable dtReturn = new DataTable();
int i=;
int j=;
int k=;
int colKey1=;
int colKey2=; //设定表dtReturn的名字
dtReturn.TableName = dt1.TableName;
//设定表dtReturn的列名
for(i=; i<dt1.Columns.Count; i++)
{
if( dt1.Columns[i].ColumnName == KeyColName )
{
colKey1=i;
} dtReturn.Columns.Add( dt1.Columns[i].ColumnName );
} for(j=; j<dt2.Columns.Count; j++)
{
if( dt2.Columns[j].ColumnName == KeyColName )
{
colKey2=j;
continue;
} dtReturn.Columns.Add(dt2.Columns[j].ColumnName);
} //建立表的空间
for(i=; i<dt1.Rows.Count; i++)
{
DataRow dr;
dr = dtReturn.NewRow();
dtReturn.Rows.Add(dr);
} //将表dt1,dt2的数据写入dtReturn
for(i=; i<dt1.Rows.Count; i++)
{
int m=-;
//表dt1的第i行数据拷贝到dtReturn中去
for(j=; j<dt1.Columns.Count; j++)
{
dtReturn.Rows[i][j] = dt1.Rows[i][j].ToString();
} //查找的dt2中KeyColName的数据,与dt1相同的行
for(k=; k<dt2.Rows.Count; k++)
{
if( dt1.Rows[i][colKey1].ToString() == dt2.Rows[k][colKey2].ToString() )
{
m=k;
}
} //表dt2的第m行数据拷贝到dtReturn中去,且不要KeyColName(ID)列
if( m!=- )
{
for(k=; k<dt2.Columns.Count; k++)
{
if( k==colKey2 )
{
continue;
}
dtReturn.Rows[i][j] = dt2.Rows[m][k].ToString();
j++;
}
}
} return dtReturn ;
}
实现两个DataTable的联合查询的更多相关文章
- 在db2中 两个数据库之间的两个表的联合查询
大家好,今天遇到了在db2中 两个数据库之间的两个表的联合查询 我知道oracle中有dblink,可是不知到db2的两个数据库联合查询怎么处理我找了类似于比如两个数据库: db1,db2用户名密码s ...
- thinkphp 两表、三表联合查询
//两表联合查询 $Model = M('T1');$Model->join('left join t2 on t1.cid = t2.id')->select();// $list = ...
- MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例
有二三年没写代码了,**内的工作就是这样,容易废人!看到园子里这么多大侠朝气蓬勃的,我想也要学点东西并和大家分享,共同进步!快乐每一天,进步每一天!言归正传! 通过最近一段时间对MVC5.EF6的学习 ...
- SharePoint 列表多表联合查询
在SharePoint平台二次开发中,我们有时需要涉及多表关联查询展示多列表中的不同字段信息:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,有一定的局限性,需 ...
- SharePoint 2013 列表多表联合查询
在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...
- SQL联合查询两个表的数据
刚有个项目,需要查询水位数据表中的水位信息,及查询降雨量表中统计时段降雨量的数据,以计算出日降雨量,而且时段是前一天8时到后一天8时总共24个小时. 两个子查询: 1.根据当前时间判断统计前天8时到今 ...
- thinkphp两表,多表联合查询及分页的连贯操作写法
ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 代码如下: $Model = new Model(); $sql ...
- myBatis中 collection 或 association 联合查询 中column 传入多个参数值
下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap" type="com.maidan.daas.entit ...
- 【转】Mysql联合查询union和union all的使用介绍
Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一.UNION和UNION ALL的作用和语法 UNION 用于合... ...
随机推荐
- Java锁--非公平锁
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3496651.html 参考代码 下面给出Java1.7.0_40版本中,ReentrantLock和AQ ...
- DevExpress Winforms使用大揭秘!那些你不了解的SvgImageBox控件
DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpr ...
- C语言calloc()函数:分配内存空间并初始化——stm32中的应用
经常在代码中看到使用malloc来分配,然后memset清零,其实calloc更加方便,一句顶两句~ 头文件:#include <stdlib.h> calloc() 函数用来动态地分配内 ...
- javascript逻辑非(!/!!)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- tomcat——web.xml
本机tomcat位置:D:\tomcat7\apache-tomcat-7.0.61 web.xml web工程的部署描述文件.在web工程中此文件并不是必须有的. 位置:D:\tomcat7\apa ...
- Codeforces Round #595 (Div. 3) A,B,C,D
A题:n个学生,分成任意组,要求每组中任意两名学生的技能值相差不等于1,问最小分组. #include<bits/stdc++.h> using namespace std; #defin ...
- 富文本编辑器粘贴word内容
很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...
- kill函数
kill函数/命令产生信号 kill命令产生信号:kill -SIGKILL pid kill函数:给指定进程发送指定信号(不一定杀死) int kill(pid_t pid, int sig); ...
- c 判断数字是否有限
/* isfinite example */ #include <stdio.h> /* printf */ #include <math.h> /* isfinite, sq ...
- Solr 7.X 安装和配置--Linux篇
1. 关闭防火墙和Selinux 2. 安装所需环境JDK 3. 下载Solr7.4版本 4. 下载并配置solr的中文分词器IK Analyzer 5. 启动Solr 6. 注意事项以及说明 1. ...