欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

sql 查询 一张表里面的数据 在另一张表中是否存在 和 比对两个集合中的差集和交集(原创)

程序员文章站 2022-05-13 21:18:41
这两天在搞一个修复的小功能 需求: A表,B表,C表,日志文件 先筛选出A表和B表中都符合条件的数据,然后检查这些数据在C表中是否存在。如果不存在,就从日志中读取数据,存入C表中,如果存在,则不做操作。 逻辑理清之后,自己尝试了很多方式,一直都不能让自己满意,都感觉性能太低,还可以在优化,因为时间关 ......

这两天在搞一个修复的小功能

需求:  a表,b表,c表,日志文件

先筛选出a表和b表中都符合条件的数据,然后检查这些数据在c表中是否存在。如果不存在,就从日志中读取数据,存入c表中,如果存在,则不做操作。

逻辑理清之后,自己尝试了很多方式,一直都不能让自己满意,都感觉性能太低,还可以在优化,因为时间关系,不能再拖了,就先记录一下 目前还凑合的实现方式,后续有时间的话,会再次优化一下。以下共勉

1 datatable dt= select   a.*,b.fhsj, case when (select count(*) from c where  fphm = a.fphm and fpdm=a.fpdm)>0 then 1 else 0 end as flag  from a  join  b  on b.listid=a.id 
where a.cfjc_pt = '1' and a.intype <> '6' and a.recog = '1' and b.cyzt=='2' and (b.fhsj between '2019-06-12 00:00:00' and '2019-06-14 23:59:59' ) order by b.fhsj desc
//注解:flag:如果a表和b表 中都符合的数据在c表中存在,则flag=1,不存在的话,flag=0;

取出日志中指定位置的数据

 1 filestream fs = new filestream(path, filemode.open, fileaccess.read, fileshare.read);
 2             streamreader sr = new streamreader(fs, system.text.encoding.default);
 3             stringbuilder sb = new stringbuilder();
 4             while (!sr.endofstream) {
 5                 sb.appendline(sr.readline() + "<br>");
 6             }
 7             string[] result = regex.matches(sb.tostring(), @"(?<=开始字符串).*?(?=结束字符串)")
 8                 .cast<match>().select(s => s.value.trim()).toarray();
 9             foreach (var item in result) {
10                 console.writeline(item.trimstart(':').trimend(','));
11             }
12             console.readkey();

因为还要比对 dt 表中的数据  在日志中是否存在。

想了一个比较low的实现,将dt表中的唯一标识的数据信息取出来,放入一个lista集合中

将日志中所需数据集合存在listb集合中

然后利用ienumerable集合中intersect(交集)函数,筛选出我所需的数据

 

 

很简单的一个小实现,每天进步一点点。。。。