您好我有一个有一些重复数据的Sql表
id T_PSProjectId T_CodePattern T_NCR
1 0000130586 3MEXCM NULL
2 0000131771 3MEXTPS NULL
3 0000131771 3MEXTPS 123456
4 0000130586 3MRA NULL
5 0000130586 3MRAS NULL
6 0000130586 3MT1 NULL
7 0000130586 3MT1 555
8 0000131176 3MT1 NULL
9 0000131190 3MT1 NULL
10 0000130584 3MT1 NULL
11 0000130584 3MT1 333000
12 0000130584 3MT1S NULL
13 0000131755 3MT1S NULL
14 0000130586 3MT1S NULL
15 0000130586 3MT1S 550000
16 0000129495 3TMEU NULL
17 0000131186 3TTHS NULL
18 0000130583 3UA1P NULL
19 0000130584 3UEXCESC NULL
20 0000130584 3UEXCESCS NULL
21 0000130583 3UEXCI NULL
22 0000130583 3UEXCIS NULL
如您所见,第3行和第4行的列T_codepattern具有相同的值 所以我想删除那些具有重复的T_PSProjectId + T_CodePattern组合并且具有T_NCR空值的行
例如:从第2行和第3行..它应该删除第2行 从第6行和第7行开始,它应该删除第6行
我的意思是删除第4列中具有相同第2和第3列值且没有值的行。
谢谢
答案 0 :(得分:4)
SQL Server的一个很好的功能是具有“可更新”CTE的能力。这意味着我们可以在with
语句中识别行,然后在删除中使用它。
with todelete as (
select t.*,
count(*) over (partition by T_PSProjectId, T_CodePattern) as cnt
from t
)
delete from todelete
where cnt > 1 and T_NCR is null;
这样做是使用窗口函数T_PSProjectId
计算具有相同值T_CodePattern
和count(*)
的行数。然后deletion
语句删除存在重复项的行,第三列具有NULL
值。
答案 1 :(得分:1)
This logic might resolve your query
DECLARE
lv_dup_check NUMBER;
BEGIN
FOR REC IN
( SELECT * FROM avrajit
)
LOOP
SELECT COUNT(*)
INTO lv_dup_check
FROM avrajit -- to check whether duplicate exist or not
WHERE name =rec.name
AND salary = rec.salary;
dbms_output.put_line(lv_dup_check);
IF rec.department IS NULL AND lv_dup_check > 1 THEN -- if duplicate exists and the 3rd col null
dbms_output.put_line ('deleted row'||' '||rec.salary);
DELETE
FROM avrajit --delete the 3rd null column with same value
WHERE name =rec.name
AND salary = rec.salary
AND department IS NULL;
END IF;
END LOOP;
END;