两个DataTable关联查询(inner join、left join)C#代码

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Text;
  4 using System.Data;
  5
  6 namespace ConsoleApplication1
  7 {
  8     /// <summary>
  9     /// 在返回的table处大断点查看结果
 10     /// </summary>
 11     class Program
 12     {
 13         static void Main(string[] args)
 14         {
 15             CreatTable();
 16         }
 17
 18         /// <summary>
 19         /// 创建两个测试表
 20         /// </summary>
 21         public static void CreatTable()
 22         {
 23             //定义数据结构
 24             DataTable Ks = new DataTable("客商"); //左表or主表
 25             DataColumn dcID = new DataColumn("ID", System.Type.GetType("System.Int32"));
 26             DataColumn dcNa = new DataColumn("客商名称", System.Type.GetType("System.String"));
 27             Ks.Columns.Add(dcID);
 28             Ks.Columns.Add(dcNa);
 29
 30             DataTable Dj = new DataTable("订单");//右表or子表
 31             DataColumn dcID2 = new DataColumn("ID", System.Type.GetType("System.Int32"));
 32             DataColumn dcNu = new DataColumn("订单数量", System.Type.GetType("System.Int32"));
 33             Dj.Columns.Add(dcID2);
 34             Dj.Columns.Add(dcNu);
 35
 36             //左表数据
 37             DataRow KsDt = Ks.NewRow();
 38             KsDt["ID"] = 11;
 39             KsDt["客商名称"] = "张三";
 40             Ks.Rows.Add(KsDt);
 41
 42             KsDt = Ks.NewRow();
 43             KsDt["ID"] = 12;
 44             KsDt["客商名称"] = "李四";
 45             Ks.Rows.Add(KsDt);
 46
 47             KsDt = Ks.NewRow();
 48             KsDt["ID"] = 13;
 49             KsDt["客商名称"] = "王武";
 50             Ks.Rows.Add(KsDt);
 51
 52             KsDt = Ks.NewRow();
 53             KsDt["ID"] = 14;
 54             KsDt["客商名称"] = "赵柳";
 55             Ks.Rows.Add(KsDt);
 56
 57
 58             //右表数据
 59             KsDt = Dj.NewRow();
 60             KsDt["ID"] = 11;
 61             KsDt["订单数量"] = 10;
 62             Dj.Rows.Add(KsDt);
 63
 64             //KsDt = Dj.NewRow();
 65             //KsDt["ID"] = 11;
 66             //KsDt["订单数量"] = 12;
 67             //Dj.Rows.Add(KsDt);
 68
 69             //KsDt = Dj.NewRow();
 70             //KsDt["ID"] = 12;
 71             //KsDt["订单数量"] = 16;
 72             //Dj.Rows.Add(KsDt);
 73
 74
 75             //KsDt = Dj.NewRow();
 76             //KsDt["ID"] = 13;
 77             //KsDt["订单数量"] = 30;
 78             //Dj.Rows.Add(KsDt);
 79
 80             KsDt = Dj.NewRow();
 81             KsDt["ID"] = 14;
 82             KsDt["订单数量"] = 40;
 83             Dj.Rows.Add(KsDt);
 84
 85             KsDt = Dj.NewRow();
 86             KsDt["ID"] = 15;
 87             KsDt["订单数量"] = 1250;
 88             Dj.Rows.Add(KsDt);
 89
 90             /*********************调用******************************************/
 91             //
 92             Join(Ks, Dj, new DataColumn[] { Ks.Columns["ID"] }, new DataColumn[] { Dj.Columns["ID"] });
 93             //重载1
 94             Join(Ks, Dj, Ks.Columns["ID"], Dj.Columns["ID"]);
 95             //重载2
 96             Join(Ks, Dj, "ID", "ID");
 97
 98             /*********************调用结束**************************************/
 99         }
100
101         /// <summary>
102         /// 建立两内存表的链接
103         /// </summary>
104         /// <param name="dt1">左表(主表)</param>
105         /// <param name="dt2">右表</param>
106         /// <param name="FJC">左表中关联的字段名(字符串)</param>
107         /// <param name="SJC">右表中关联的字段名(字符串)</param>
108         /// <returns></returns>
109         public static DataTable Join(DataTable dt1, DataTable dt2, DataColumn[] FJC, DataColumn[] SJC)
110         {
111             //创建一个新的DataTable
112             DataTable table = new DataTable("Join");
113
114             // Use a DataSet to leverage DataRelation
115             using (DataSet ds = new DataSet())
116             {
117                 //把DataTable Copy到DataSet中
118                 ds.Tables.AddRange(new DataTable[] { dt1.Copy(), dt2.Copy() });
119
120                 DataColumn[] First_columns = new DataColumn[FJC.Length];
121                 for (int i = 0; i < First_columns.Length; i++)
122                 {
123                     First_columns[i] = ds.Tables[0].Columns[FJC[i].ColumnName];
124                 }
125
126                 DataColumn[] Second_columns = new DataColumn[SJC.Length];
127                 for (int i = 0; i < Second_columns.Length; i++)
128                 {
129                     Second_columns[i] = ds.Tables[1].Columns[SJC[i].ColumnName];
130                 }
131
132                 //创建关联
133                 DataRelation r = new DataRelation(string.Empty, First_columns, Second_columns, false);
134                 ds.Relations.Add(r);
135
136                 //为关联表创建列
137                 for (int i = 0; i < dt1.Columns.Count; i++)
138                 {
139                     table.Columns.Add(dt1.Columns[i].ColumnName, dt1.Columns[i].DataType);
140                 }
141
142                 for (int i = 0; i < dt2.Columns.Count; i++)
143                 {
144                     //看看有没有重复的列,如果有在第二个DataTable的Column的列明后加_Second
145                     if (!table.Columns.Contains(dt2.Columns[i].ColumnName))
146                         table.Columns.Add(dt2.Columns[i].ColumnName, dt2.Columns[i].DataType);
147                     else
148                         table.Columns.Add(dt2.Columns[i].ColumnName + "_Second", dt2.Columns[i].DataType);
149                 }
150
151                 table.BeginLoadData();
152                 int itable2Colomns = ds.Tables[1].Rows[0].ItemArray.Length;
153                 foreach (DataRow firstrow in ds.Tables[0].Rows)
154                 {
155                     //得到行的数据
156                     DataRow[] childrows = firstrow.GetChildRows(r);//第二个表关联的行
157                     if (childrows != null && childrows.Length > 0)
158                     {
159                         object[] parentarray = firstrow.ItemArray;
160                         foreach (DataRow secondrow in childrows)
161                         {
162                             object[] secondarray = secondrow.ItemArray;
163                             object[] joinarray = new object[parentarray.Length + secondarray.Length];
164                             Array.Copy(parentarray, 0, joinarray, 0, parentarray.Length);
165                             Array.Copy(secondarray, 0, joinarray, parentarray.Length, secondarray.Length);
166                             table.LoadDataRow(joinarray, true);
167                         }
168
169                     }
170                     else//如果有外连接(Left Join)添加这部分代码
171                     {
172                         object[] table1array = firstrow.ItemArray;//Table1
173                         object[] table2array = new object[itable2Colomns];
174                         object[] joinarray = new object[table1array.Length + itable2Colomns];
175                         Array.Copy(table1array, 0, joinarray, 0, table1array.Length);
176                         Array.Copy(table2array, 0, joinarray, table1array.Length, itable2Colomns);
177                         table.LoadDataRow(joinarray, true);
178                         DataColumn[] dc = new DataColumn[2];
179                         dc[0] = new DataColumn("");
180                     }
181                 }
182                 table.EndLoadData();
183             }
184             return table;//***在此处打断点,程序运行后点击查看即可观察到结果
185         }
186
187         /// <summary>
188         /// 重载1
189         /// </summary>
190         /// <param name="dt1"></param>
191         /// <param name="dt2"></param>
192         /// <param name="FJC"></param>
193         /// <param name="SJC"></param>
194         /// <returns></returns>
195         public static DataTable Join(DataTable dt1, DataTable dt2, DataColumn FJC, DataColumn SJC)
196         {
197             return Join(dt1, dt2, new DataColumn[] { FJC }, new DataColumn[] { SJC });
198         }
199
200         /// <summary>
201         /// 重载2
202         /// </summary>
203         /// <param name="dt1"></param>
204         /// <param name="dt2"></param>
205         /// <param name="FJC"></param>
206         /// <param name="SJC"></param>
207         /// <returns></returns>
208         public static DataTable Join(DataTable dt1, DataTable dt2, string FJC, string SJC)
209         {
210             return Join(dt1, dt2, new DataColumn[] { dt1.Columns[FJC] }, new DataColumn[] { dt1.Columns[SJC] });
211         }
212
213     }
214 }

上面运行的结果:

这是通过网上整理的,适合处理两个服务器上的数据关联。欢迎留言。

时间: 2024-12-21 02:17:43

两个DataTable关联查询(inner join、left join)C#代码的相关文章

175. Combine Two Tables【LeetCode】-LEFT JON 和RIGHT JOIN,两张表关联查询-java -sql入门

Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId | int | | FirstName | varchar | | LastName | varchar | +-------------+---------+ PersonId is the primary key column for this table. Table: Address +--

Yii2中多表关联查询(with、join、joinwith)

表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order         (id  order_name   customer_id   book_id) 图书表Book          (id  book_name    author_id) 作者表Author        (id  author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer ex

2016.1.22 利用LINQ实现DataSet内多张DataTable关联查询操作(目前未发现太大价值)

DataSet ds = new DataSet(); DataTable t1 = DBFactorySingleton.GetInstance().Factory.GetDataTable(sql_ndp).Copy(); t1.TableName = "t1"; DataTable t2 = DBFactorySingleton.GetInstance().Factory.GetDataTable(sql_naip).Copy(); t2.TableName = "t2

JDBC MySQL 多表关联查询查询

public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb","root",""); String sql ="select

CI 多表关联查询

方法一:$this->db->query("sql  语句");     直接写sql语句 方法二: #多表关联查询 $data=$this->db->from('goods') ->join('shop','shop.shopid=goods.shopid') ->join('category','category.cid=goods.cid') ->join('locality','locality.lid=goods.lid') ->

Yii2中多表关联查询(join、joinwith) with是不执行sql的

Yii2中多表关联查询(join.joinwith) 我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer (id customer_name) 订单表Order (id order_name customer_id book_id) 图书表 (id book_name author_id) 作者表 (id author_name) 模型定义 下面是这4个个模型的定义,只写出其中的关联 Customer class Customer extends \

SQL两表关联查询&批量修改字段值

SQL关联查询&修改字段,正确范例如下: --批量修改报告单位名称&更新时间 --tt和tp两表关联查询,将符合条件的tt表中的principal字段更新到tp表的ruperson字段 merge into nhis34.t_publicplaces tp using standard.t_organization tt on (tt.orgcode = tp.r_orgcode and tp.create_time > '2015-05-07 00:00:00') when mat

(一)SQL关联查询的使用技巧 (各种 join)

---恢复内容开始--- (一)SQL关联查询的使用技巧 (各种 join) 这几天因为工作的时候,发现自己的sql语句基础不是很好,特意研究了一下,发现sql语句真的是博大精深,sql语句不仅是要查出来你想要的数据,更讲究查询的效率,因为在查询大量数据时往往会因为数据量大,造成效率很低,再加上前后台数据的交互,造成了访问延迟等等的一系列问题. 在我们的日常工作中往往用到很多的查询方式,例如 嵌套查询,关联查询,子查询等等,就我而言,我感觉关联查询是最容易学习,和效率最高的.下面就我总结的关联查

Yii2中多表关联查询(join、joinwith)

我们用实例来说明这一部分 表结构 现在有客户表.订单表.图书表.作者表, 客户表Customer   (id  customer_name) 订单表Order          (id  order_name       customer_id   book_id) 图书表                    (id  book_name       author_id) 作者表                    (id  author_name) 模型定义 下面是这4个个模型的定义,只写