如方法一描述:将子表的数组追加到主表数组的下面。从而实现类似于视图(单表)的效果。

那么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的联合查询的更多相关文章

  1. 在db2中 两个数据库之间的两个表的联合查询

    大家好,今天遇到了在db2中 两个数据库之间的两个表的联合查询 我知道oracle中有dblink,可是不知到db2的两个数据库联合查询怎么处理我找了类似于比如两个数据库: db1,db2用户名密码s ...

  2. thinkphp 两表、三表联合查询

    //两表联合查询 $Model = M('T1');$Model->join('left join t2 on t1.cid = t2.id')->select();// $list = ...

  3. MVC5+EF6简单实例---以原有SQLServer数据库两表联合查询为例

    有二三年没写代码了,**内的工作就是这样,容易废人!看到园子里这么多大侠朝气蓬勃的,我想也要学点东西并和大家分享,共同进步!快乐每一天,进步每一天!言归正传! 通过最近一段时间对MVC5.EF6的学习 ...

  4. SharePoint 列表多表联合查询

    在SharePoint平台二次开发中,我们有时需要涉及多表关联查询展示多列表中的不同字段信息:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,有一定的局限性,需 ...

  5. SharePoint 2013 列表多表联合查询

    在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...

  6. SQL联合查询两个表的数据

    刚有个项目,需要查询水位数据表中的水位信息,及查询降雨量表中统计时段降雨量的数据,以计算出日降雨量,而且时段是前一天8时到后一天8时总共24个小时. 两个子查询: 1.根据当前时间判断统计前天8时到今 ...

  7. thinkphp两表,多表联合查询及分页的连贯操作写法

    ThinkPHP中关联查询(即多表联合查询)可以使用 table() 方法或和join方法,具体使用如下例所示: 1.原生查询示例: 代码如下: $Model = new Model(); $sql  ...

  8. myBatis中 collection 或 association 联合查询 中column 传入多个参数值

    下面是一个树形结构表自连接 联合查询 Demo <resultMap id="BaseResultMap"  type="com.maidan.daas.entit ...

  9. 【转】Mysql联合查询union和union all的使用介绍

    Mysql的联合查询命令UNION和UNION ALL,总结了使用语法和注意事项,以及学习例子和项目例子,需要的朋友可以参考下 一.UNION和UNION ALL的作用和语法 UNION 用于合... ...

随机推荐

  1. spring replaced method 注入

           replaced method注入是spring动态改变bean里方法的实现.需要改变的方法,使用spring内原有其他类(需要继承接口org.springframework.beans ...

  2. Struts2入门2

    五.Struts2的工作原理及文件结构 Struts2过滤与自己相关的请求,比如.action后缀的请求,Struts2会进行过滤和处理,但如果是.html或者.jsp,Struts2不会对其进行处理 ...

  3. 洛谷P2114 起床困难综合症【位运算】【贪心】

    题目:https://www.luogu.org/problemnew/show/P2114 题意:有n个操作,每个可以是与.或.异或 一个数. 初始值是0~m之间的一个数,问经过n个运算之后,可以得 ...

  4. parents()和parent()

    $("").parent().parent()  //父元素的父元素 $("").parents("tr")  // 祖先元素 找到tr

  5. BZOJ 4025 二分图 LCT维护最大生成树

    怎么说呢,我也不知道该咋讲,你就手画一下然后 yy 一下就发现这么做是对的. 为什么我明明都想出来了,却还是讲不出来啊~ #include <cstdio> #include <ve ...

  6. redis系列(一):安装配置

    1.下载安装 下载可到redis官网下载(可根据自己的操作系统下载,我的是Ubuntu) 目前redis最新版本是5.0.2:下载地址为:http://download.redis.io/releas ...

  7. [2]windows内核情景分析--系统调用

    Windows的地址空间分用户模式与内核模式,低2GB的部分叫用户模式,高2G的部分叫内核模式,位于用户空间的代码不能访问内核空间,位于内核空间的代码却可以访问用户空间 一个线程的运行状态分内核态与用 ...

  8. 验证码的实现类ValidateCode

    package com.yujie.util; import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.Buffere ...

  9. 2019腾讯前端技术大会资源TWeb

    扫码关注公众号 回复“TWeb”即可获取“2019腾讯前端技术大会”的PPT

  10. Open Live Writer 显示不出来代码着色插件解决办法

    下载地址: Open Live Writer 插件更新 下载后要把下面这5个文件,全部解除锁定(右键属性打开) Memento.OLW.Plugins.dll OLWPlugins.css OpenL ...