【问题标题】:Can we delete duplicate records from a table in teradata without using intermediate table我们可以在不使用中间表的情况下从 teradata 中的表中删除重复记录吗
【发布时间】:2013-11-01 11:01:39
【问题描述】:

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

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

【问题讨论】:

    标签: teradata


    【解决方案1】:

    除非在您的系统上启用了 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以删除重复项,然后重新插入

    【讨论】:

      【解决方案2】:

      使用相同的方法,但在中间创建一个 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()...这只是一个建议)。

      【讨论】:

        【解决方案3】:

        ---不创建中间表

        delete FROM ORGINAL_TABLE WHERE (COL1, 2) in (select COL1, count() from ORGINAL_TABLE 按 1 分组 有 COUNT() >1 ) 和 DUPLICATE_BASED_COL >1; --------删除一行(保留)

        如果你有重复,想删除一行,那么我们需要使用sql中的最后一行,如果我们想删除两行,则忽略条件。

        【讨论】:

          【解决方案4】:
          1. 创建没有 dup 的表

            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;
            

          【讨论】:

            猜你喜欢
            • 2021-10-05
            • 2017-04-13
            • 2018-05-10
            • 2014-10-17
            • 2014-04-04
            • 1970-01-01
            • 2011-05-22
            • 2011-01-02
            • 2016-01-07
            相关资源
            最近更新 更多