我们可以在不使用中间表的情况下从 teradata 中的多集表中删除重复记录吗?
假设我们的多集表中有 2 行,其值为 1、2、3 和 1、2、3,那么删除后我应该只有一行,即 1、2、3。
我们可以在不使用中间表的情况下从 teradata 中的多集表中删除重复记录吗?
假设我们的多集表中有 2 行,其值为 1、2、3 和 1、2、3,那么删除后我应该只有一行,即 1、2、3。
除非在您的系统上启用了 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 以消除重复项,然后重新插入回来创建没有 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;
使用相同的方法,但在中间创建一个 volatile 表。
CREATE VOLATILE MULTISET TABLE TEMPDB.TEMP_DUP_ID (
Row_ID DECIMAL(31,0) ) PRIMARY INDEX (Row_ID) ON COMMIT PRESERVE ROWS;
INSERT INTO TEMPDB.TEMP_DUP_ID SELECT ROW_ID FROM DB.TABLE T QUALIFY ROW_NUMBER() OVER (PARTITION BY DUP ORDER BY DUP DESC) > 1
然后使用表删除。
理想情况下,每行都有唯一的键,否则,您将需要更多地操作数据以生成一个(例如使用 row_number() ......这只是一个建议)。
---不创建中间表
删除 FROM ORGINAL_TABLE WHERE (COL1, 2) in (select COL1, count( ) from ORGINAL_TABLE GROUP BY 1 HAVING COUNT( ) >1) 和 DUPLICATE_BASED_COL >1; --------删除一行(保留)
如果你有重复并且想要删除一行,那么我们需要使用 sql 中的最后一行,如果我们想要删除两行,则忽略该条件。