我们可以在不使用中间表的情况下从teradata中的表中删除重复记录

时间:2013-10-23 08:51:52

标签: teradata

我们可以在不使用中间表的情况下从teradata中的多集表删除重复记录吗。

假设我们有2行值 1,2,3 和1,2,3 在我的multiset表中然后删除后我应该有 只有一行,即1,2,3。

4 个答案:

答案 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)

  1. 无需复制即可创建表

    CREATE TABLE new AS (SELECT DISTINCT * FROM old) WITH DATA;
    
  2. 验证

    select * from new;
    
  3. 放下原来的

    drop table old;
    
  4. 将新表重命名为原始表

    RENAME TABLE new to old; 
    
  5. 验证

    select * from old;