【发布时间】:2013-11-01 11:01:39
【问题描述】:
我们能否在不使用中间表的情况下从 teradata 中的多集表中删除重复记录。
假设我们有 2 行的值 1、2、3 和 1, 2, 3 在我的多集表中,然后在删除后我应该有 只有一行,即 1、2、3。
【问题讨论】:
标签: teradata
我们能否在不使用中间表的情况下从 teradata 中的多集表中删除重复记录。
假设我们有 2 行的值 1、2、3 和 1, 2, 3 在我的多集表中,然后在删除后我应该有 只有一行,即 1、2、3。
【问题讨论】:
标签: teradata
除非在您的系统上启用了 ROWID 使用(并且概率很低),否则您不能这样做。您可以通过尝试解释 SELECT ROWID FROM 表来轻松测试它;
否则有两种可能的方法。
重复次数少:
SELECT all columns FROM table GROUP BY all columns HAVING COUNT(*) > 1;的结果
DELETE FROM tab WHERE EXISTS (SELECT * FROM newtab WHERE...)INSERT INTO tab SELECT * FROM newtab大量重复:
SELECT DISTINCT *复制到新表或复制到SET TABLE以删除重复项,然后重新插入【讨论】:
使用相同的方法,但在中间创建一个 volatile 表。
创建易失性多组表 TEMPDB.TEMP_DUP_ID (
Row_ID DECIMAL(31,0)
) 主索引 (Row_ID)
提交保留行;
插入到 TEMPDB.TEMP_DUP_ID 选择 ROW_ID 来自 DB.TABLE T QUALIFY ROW_NUMBER() OVER (PARTITION BY DUP ORDER BY DUP DESC) > 1
然后使用表删除。
理想情况下,每行都有唯一的键,否则,您将需要更多地操作数据以生成一个(例如使用 row_number()...这只是一个建议)。
【讨论】:
---不创建中间表
delete FROM ORGINAL_TABLE WHERE (COL1, 2) in (select COL1, count() from ORGINAL_TABLE 按 1 分组 有 COUNT() >1 ) 和 DUPLICATE_BASED_COL >1; --------删除一行(保留)
如果你有重复,想删除一行,那么我们需要使用sql中的最后一行,如果我们想删除两行,则忽略条件。
【讨论】:
创建没有 dup 的表
CREATE TABLE new AS (SELECT DISTINCT * FROM old) WITH DATA;
验证
select * from new;
删除原来的
drop table old;
将新表重命名为原始表
RENAME TABLE new to old;
验证
select * from old;
【讨论】: