数据表对比问题

时间:2022-10-21 18:07:48
表 ArrearageList

字段:
mphonecode    usrname     feesumdeb  recvmonth
13008708674   刘五清      10         200404
13008739366   安强        87.55      200402
13109337241   杨秀芳      23.83      200401
13008717797   *敏      10         200401

到了月底,需要把新的数据跟表 ArrearageList 里的数据进行比较(新数据的数据表结构和ArrearageList一模一样)

新数据表 TempArrearageList

字段:
mphonecode    usrname     feesumdeb  recvmonth
13008708674   刘五清      10         200404
13008739366   安强        165.57     200403
13109337241   杨秀芳      5          200402
13008721231   董泰山      106.33     200405

要求:
    -- 新增欠费
    1.如果 TempArrearageList 里有 ArrearageList 里没有的数据,就把这个新加的数据添加到 ArrearageList 里。(如现在就是要“判断” 13008721231 董泰山 这一条记录是 ArrearageList 里没有的,insert 这条记录到 ArrearageList 里)
      如果新数据里 feesumdeb 值比 旧数据里 feesumdeb 的值大,这条记录也同样属于 新增欠费。
修改旧数据中 feesumdeb 的值为新数据值。(如要把 13008739366   安强        87.55      200402 这条记录改为 13008739366   安强        165.57     200403)

      最后把新增数据添加到“新增数据表”NewArrearageList 表(结构也一样) 

    -- 未交费
    2.两个表里 mphonecode    usrname     feesumdeb 这三个字段都相同(即数据没有改变)的话,保持原 ArrearageList 里的对应记录不动。

    -- 部分交费
    3.如
ArrearageList 表里
13109337241   杨秀芳      23.83      200401

TempArrearageList 表里
13109337241   杨秀芳      5          200402

因为5 < 23.83 ,所以是部分交费 。

要修改 ArrearageList 表记录为
13109337241   杨秀芳      5          200401

把此数据添加到部分交费表 PaymentDetail

   -- 已交费
   4. 旧数据中有,新数据中没有,就是已交费。

如 13008717797   *敏 这条记录

删除这条记录,把这个表添加到 已交费表 Handed


**********************************************************************

不知大家有什么好思路?
我本来想都读取程序里进行循环对比的,但是这样可能程序运行会慢得多。内存占用太大。
最好尽量能使用 SQL 语句实现。

bow


5 个解决方案

#1


这是我写的

-- 未交费 (欠费金额相等,即是未交费的)
select * from TempArrearageList where exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode and ArrearageList.usrname=TempArrearageList.usrname and ArrearageList.feesumdeb=TempArrearageList.feesumdeb)

-- 部分交费 (欠费金额不相等,即是部分交费的)
select * from TempArrearageList where exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode and ArrearageList.usrname=TempArrearageList.usrname and ArrearageList.feesumdeb<>TempArrearageList.feesumdeb)

-- 新增欠费

-- A 手机号完全不在旧数据中
select * from TempArrearageList where not exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode)

-- B 手机号在旧数据中,可 usrname <> 旧数据中的usrname
select * from TempArrearageList where exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode and ArrearageList.usrname<>TempArrearageList.usrname)

#2


这个SQL语句的实现倒没什么,只是这样的设计实在麻烦.不知道原来是什么样的业务需求?

#3


哥,这么多,看都看晕了

#4


呵呵,这要做的是 手机的欠费追缴
每到月底,联通要用联创做的系统导出一个excel格式的 欠费清单。
我要进行数据的对比

#5


顶上一顶

#1


这是我写的

-- 未交费 (欠费金额相等,即是未交费的)
select * from TempArrearageList where exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode and ArrearageList.usrname=TempArrearageList.usrname and ArrearageList.feesumdeb=TempArrearageList.feesumdeb)

-- 部分交费 (欠费金额不相等,即是部分交费的)
select * from TempArrearageList where exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode and ArrearageList.usrname=TempArrearageList.usrname and ArrearageList.feesumdeb<>TempArrearageList.feesumdeb)

-- 新增欠费

-- A 手机号完全不在旧数据中
select * from TempArrearageList where not exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode)

-- B 手机号在旧数据中,可 usrname <> 旧数据中的usrname
select * from TempArrearageList where exists (select * from ArrearageList where ArrearageList.mphonecode=TempArrearageList.mphonecode and ArrearageList.usrname<>TempArrearageList.usrname)

#2


这个SQL语句的实现倒没什么,只是这样的设计实在麻烦.不知道原来是什么样的业务需求?

#3


哥,这么多,看都看晕了

#4


呵呵,这要做的是 手机的欠费追缴
每到月底,联通要用联创做的系统导出一个excel格式的 欠费清单。
我要进行数据的对比

#5


顶上一顶