我们可以在不使用中间表的情况下从teradata中的多集表删除重复记录吗。
假设我们有2行值 1,2,3 和1,2,3 在我的multiset表中然后删除后我应该有 只有一行,即1,2,3。
答案 0 :(得分: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以删除重复项,然后重新插入答案 1 :(得分:0)
使用相同的方法,但在中间创建一个易失性表。
CREATE VOLATILE MULTISET TABLE TEMPDB.TEMP_DUP_ID(
Row_ID DECIMAL(31,0)
)PRIMARY INDEX(Row_ID)
在COMMIT PRESERVE ROWS;
INSERT INTO TEMPDB.TEMP_DUP_ID SELECT ROW_ID 来自DB.TABLE T. QUALIFY ROW_NUMBER()(按DUP DESC划分DUP顺序)> 1
然后使用该表删除。
理想情况下,每行会有唯一的密钥,否则,您需要更多地操作数据以生成一个(例如,使用row_number()......这只是一个推荐)。
答案 2 :(得分:0)
---不创建中间表
从ORGINAL_TABLE中的(选择COL1,count()中的ORGINAL_TABLE WHERE(COL1,2)中删除 分组1 拥有COUNT()> 1) 并且DUPLICATE_BASED_COL> 1; -------删除一行(保留)
如果您有重复项并想要删除一行,那么我们需要使用sql中的最后一行,如果要删除两行,则忽略条件。
答案 3 :(得分:0)
无需复制即可创建表
CREATE TABLE new AS (SELECT DISTINCT * FROM old) WITH DATA;
验证
select * from new;
放下原来的
drop table old;
将新表重命名为原始表
RENAME TABLE new to old;
验证
select * from old;