利用dataset的Relations为两个DataTable创建类似SQL中Left join 的效果

 

 

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Data;

namespace ConsoleApplication7

{

    class Program

    {

      

        static void Main(string[] args)

        {

            DataSet ds = new DataSet();

          

             //以下示例实现 利用dataset的Relations为两个DataTable创建类似SQL中Left join 的效果

            //From chj

            //定义数据结构

            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"] = 11;

            KsDt["客商名称"] = "张三";

            Ks.Rows.Add(KsDt);

 

            KsDt = Ks.NewRow();

            KsDt["ID"] = 12;

            KsDt["客商名称"] = "李四";

            Ks.Rows.Add(KsDt);

 

            KsDt = Ks.NewRow();

            KsDt["ID"] = 13;

            KsDt["客商名称"] = "王武";

            Ks.Rows.Add(KsDt);

 

            KsDt = Ks.NewRow();

            KsDt["ID"] = 14;

            KsDt["客商名称"] = "赵柳";

            Ks.Rows.Add(KsDt);

 

 

            //右表数据

            KsDt = Dj.NewRow();

            KsDt["ID"] = 11;

            KsDt["订单数量"] = 10;

            Dj.Rows.Add(KsDt);

 

            KsDt = Dj.NewRow();

            KsDt["ID"] = 12;

            KsDt["订单数量"] = 20;

            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"] = 14;

            KsDt["订单数量"] = 40;

            Dj.Rows.Add(KsDt);

 

            KsDt = Dj.NewRow();

            KsDt["ID"] = 15;

            KsDt["订单数量"] = 1250;

            Dj.Rows.Add(KsDt);

 

            ds.Tables.Add(Ks);

            ds.Tables.Add(Dj);

 

            //建立两内存表的链接

            //没有为 createConstraints 标志指定任何值(默认为 true,它假定 子 表中的所有行都具有一个存在于父表中的主键值。

            //如果子列可能包含父列不包含的值,添加 DataRelation 时请将 createConstraints 标志设置为 false

            ds.Relations.Add("左联", Ks.Columns["ID"], Dj.Columns["ID"],false );

 

            //历遍父表所有的行并赋值给parentRow

            foreach (DataRow parentRow in ds.Relations["左联"].ParentTable.Rows)

            {

                //历遍parentRow相关的所有子行并赋值给childRow

                foreach (DataRow childRow in parentRow.GetChildRows(ds.Relations["左联"]))

                {

                    Console.WriteLine("父表中的ID{0}  父表中的客商名称: {1}  子表中的订单数量:{2}",parentRow["ID"],parentRow["客商名称"],childRow["订单数量"]);

                                                         

                }

               

            }

            Console.ReadLine();

        

        }

    }

}

 

 

可以使用Flink的DataSet API和JDBC连接Oracle数据库来实现左连接查询两个表。具体步骤如下: 1. 在Flink使用JDBC连接Oracle数据库。可以使用Flink提供的JDBCInputFormat读取表数据,示例代码如下: ```java String driverName = "oracle.jdbc.driver.OracleDriver"; String dbURL = "jdbc:oracle:thin:@localhost:1521:ORCL"; String username = "username"; String password = "password"; JDBCInputFormat inputFormat = JDBCInputFormat.buildJDBCInputFormat() .setDrivername(driverName) .setDBUrl(dbURL) .setUsername(username) .setPassword(password) .setQuery("SELECT * FROM table1") .setRowTypeInfo(rowTypeInfo) .finish(); ``` 2. 使用DataSet API进行左连接查询。可以使用leftOuterJoin方法将两个DataSet进行左连接,示例代码如下: ```java DataSet<Tuple2<String, String>> table1 = ... DataSet<Tuple2<String, String>> table2 = ... DataSet<Tuple2<String, String>> result = table1.leftOuterJoin(table2) .where(0) // 指定table1的join字段 .equalTo(1) // 指定table2的join字段 .with(new JoinFunction<Tuple2<String, String>, Tuple2<String, String>, Tuple2<String, String>>() { @Override public Tuple2<String, String> join(Tuple2<String, String> first, Tuple2<String, String> second) throws Exception { if (second == null) { // 表示table2没有与table1匹配的记录 return new Tuple2<>(first.f0, ""); } else { return new Tuple2<>(first.f0, second.f1); } } }); ``` 在上面的代码,我们使用了JoinFunction自定义了一个左连接函数,如果table2没有与table1匹配的记录,我们将第二个字段设为空字符串。 3. 将查询结果输出到控制台或其他存储介质。可以使用print或write方法输出结果,示例代码如下: ```java result.print(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值