在没有唯一键的情况下消除 Netezza 中的重复行
大型表中的重复数据会影响存储和数据质量。 删除这些没有唯一标识符的重复项是一个挑战。虽然使用行号(在标准 SQL 中常见)等技术并不直接适用于 Netezza,但存在一种高效的替代方法。
Netezza 方法:利用 DELETE
命令
Netezza 在 USING
语句中使用 DELETE
关键字提供了强大的解决方案。 考虑这个例子:
<code class="language-sql">DELETE FROM table_with_dups T1 USING table_with_dups T2 WHERE T1.ctid < T2.ctid AND T1.column1 = T2.column1 AND T1.column2 = T2.column2 -- ... add more columns as needed ...</code>
此查询将 table_with_dups
中的每一行 (T1) 与所有其他行 (T2) 进行比较。 它根据 ctid
(行 ID)值识别并删除旧的重复行。 AND
条件确保只有在指定列中具有相同值的行才被视为重复。
删除前预览
要在执行 DELETE
命令之前查看计划删除的行,请将 DELETE
替换为 SELECT *
,并将 USING
关键字替换为逗号:
<code class="language-sql">SELECT * FROM table_with_dups T1, table_with_dups T2 WHERE T1.ctid < T2.ctid AND T1.column1 = T2.column1 AND T1.column2 = T2.column2 -- ... add more columns as needed ...</code>
性能优化
为了获得最佳性能,请避免使用 NOT IN
子句,它会因子查询开销而显着减慢进程。 这里演示的 USING
方法在大多数情况下都能提供卓越的速度。
处理 NULL 值
如果任何键列包含 NULL
值,请在 COALESCE()
子句中使用 WHERE
函数以确保准确比较:
<code class="language-sql"> AND COALESCE(T1.col_with_nulls, '[NULL]') = COALESCE(T2.col_with_nulls, '[NULL]') ``` This treats `NULL` values consistently. Replace `col_with_nulls` with the actual column name. Remember to adjust the column list in the `WHERE` clause to include all relevant columns for duplicate identification.</code>
以上是如何在没有唯一标识符的情况下有效删除 Netezza 中的重复行?的详细内容。更多信息请关注PHP中文网其他相关文章!