我正在尝试从netezza表中删除重复记录。但很少有列包含空值,因此代码下方不起作用。
p2-p1
注意:COL2列包含空值。 我们在此表中共有30列,6列包含重复记录的空值。
任何人都可以帮我解决这个问题。
答案 0 :(得分:0)
您可以使用NVL函数将空值转换为可比较的值。 *编辑:你评论说NVL不起作用。或者,您可以重写查询以显式处理NULL:
例如:
DELETE FROM TABLE_NAME a
WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
FROM TABLE_NAME b
WHERE((a.COL1 = b.COL1) or (a.COL1 is null and b.COL1 is null))
AND ((a.COL2 = b.COL2) or (a.COL2 is null and b.COL2 is null))
AND ((a.COL3 = b.COL3) or (a.COL3 is null and b.COL3 is null));
答案 1 :(得分:0)
DELETE FROM TABLE_NAME a
WHERE ROW_NUMBER() <> ( SELECT MIN( ROW_NUMBER() )
FROM TABLE_NAME b
WHERE nvl(a.COL1,0) = nvl(b.COL1,0)
AND nvl(a.COL2,0) = nvl(b.COL2,0)
and nvl(a.COL3,0) = nvl(b.COL3,0));
使用NVL函数将空值替换为0
答案 2 :(得分:0)
Try using the /=/ operator instead of = It usually works for me in these situations
答案 3 :(得分:0)
对于上下文,表的分配列是什么,表中有多少行,以及您希望重复的那些百分比是多少?根据规模,CTAS方法可能比DELETE更合适。
话虽如此,这是一种让删除逻辑正确的方法,但可能不是最佳表现者。
TESTDB.ADMIN(ADMIN)=> select * from table_name;
COL1 | COL2 | COL3
------+------+------
X | | Y
X | | Y
E | VAL | F
A | | B
X | | Y
(5 rows)
delete
from
table_name
where rowid in
( select
rowid
from
( select
rowid,
row_number() over (
partition by col1,
col2 ,
col3
order by
col1) rn
from
table_name
) foo
where rn > 1
) ;
DELETE 2
TESTDB.ADMIN(ADMIN)=> select * from table_name;
COL1 | COL2 | COL3
------+------+------
A | | B
X | | Y
E | VAL | F
(3 rows)