有两张表
一张是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)