现在有这个一个需求:将黑名单(app_black)和逾期客户管理(app_yq_customer)两张数据表的数据导出来.其app_yq_customer
没有主键,有大量重复数据,并且两张表之间也可能有重复数据。先要求:导出数据不能重复,身份证号码相同的按警告级别高的导出,身份证号码相同的按警告级别也相同的则按修改时间最新的导出。
大致有这么几个方案:1。直接写sql语句把要用的数据筛选出来。2。新建一个临时表,先将两张表的数据放入临时表,然后筛选。
3。查询所有数据,在程序端处理。
方案1,方案2 都是同一个难点--sql 写不出来....(有点难度。。。有时间可以再试试)。
方案3. 经测试datarow.delete() 在datatable.AcceptChanges()之前是不会改变行的排列的,只是将 datarow的状态标记成deleted.
现方案如下:将数据从数据库取出按身份证,警告级别,修改时间排序。这样我们需要的数据就都排在相同身份证的第一行。
strSql="select * from (select n.hf_id,n.acc_name,n.warn_level,n.risk_code,replace(n.remark,chr(13)||chr(10),' '),"
+" n.input_date,n.input_person,n.fundaccount from app_black n where n.warn_level <> 2 and n.risk_code is not null"
+" union all"
+" select b.yq_idcard,b.yq_name,b.yq_warning_level,b.risk_code,'',"
+" b.yq_importdate,b.yq_op_id,b.fundaccount from app_yq_customer b where b.yq_warning_level<>4 and b.risk_code is not null) order by hf_id,warn_level desc,input_date desc";
特别注意:datatable 删除数据我们一般从后往前删,这样就不会破坏还没有检索的数据。(我在从前面往后面删的时候发现datatable 里面的数据全乱了。。。)
for(int i=dt.Rows.Count-1;i>0;i--)
{
string curr=dt.Rows[i][0].ToString();
string pre=dt.Rows[i-1][0].ToString();
if(curr==pre)
{
dt.Rows[i].Delete();
}
}
dt.AcceptChanges();