当前位置: 代码迷 >> Sql Server >> 删除多余数据
  详细解决方案

删除多余数据

热度:66   发布时间:2016-04-24 09:28:49.0
求助删除多余数据
有两张表

一张是T_header
一张是T_Detailes   

T_header有列

公司id  序列id  这2个是主键
顾客id  日期   这几个列

T_Detailes
公司id  序列id  序列明细id  这3个是主键
产品    这几个列  

T_Detailes   是 T_header的明细表

求助
T_header 内 公司id  顾客id  日期 相同时,如果存在多的数据,就删除,只保留一条
同时删除T_Detailes中公司id和 序列id与T_header相同的数据

假设
T_header
公司id  序列id   顾客id  日期   
1         111        A1        20141225
1         222        A1        20141225

T_Detailes
公司id      序列id        序列明细id     产品 
1              111             1                     pro1
1              111             2                     pro2
1              222             1                     pro1
1              222             2                     pro2

这样的数据 删完后变成
T_header
公司id  序列id   顾客id  日期   
1         111        A1        20141225

T_Detailes
公司id      序列id        序列明细id     产品 
1              111             1                     pro1
1              111             2                     pro2

------解决思路----------------------
DELETE T2
FROM (
SELECT 序列id FROM (
SELECT 序列id,ROW_NUMBER()OVER(PARTITION BY 公司id,顾客id,日期 ORDER BY 序列id)RN
FROM T_header
)CTE
WHERE RN>1
) T1
JOIN T_Detailes T2 ON T1.序列id=T2.序列id

;WITH CTE AS(
SELECT 序列id,ROW_NUMBER()OVER(PARTITION BY 公司id,顾客id,日期 ORDER BY 序列id)RN
FROM T_header
)
DELETE FROM CTE
WHERE RN>1

------解决思路----------------------
--先删明细再删主表就可以了
DELETE T_Detail
 WHERE EXISTS(
                SELECT *
                  FROM T_header h
                 WHERE h.公司id = T_Detail.公司id
                   AND h.序列id = T_Detail.序列id
                   AND EXISTS (
                                SELECT *
                                  FROM T_header t
                                 WHERE t.公司id = h.公司id
                                   AND t.顾客id = h.顾客id
                                   AND t.日期 = h.日期
                                   AND t.序列id < h.序列id
                              )
              )


DELETE T_header
  WHERE EXISTS(SELECT *
                 FROM T_header t
                WHERE t.公司id = T_header.公司id
                  AND t.顾客id = T_header.顾客id
                  AND t.日期 = T_header.日期
                  AND t.序列id < T_header.序列id)
  相关解决方案