1

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

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

4

4 回答 4

4

除非在您的系统上启用了 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 以消除重复项,然后重新插入回来
于 2013-10-23T17:59:12.620 回答
0
  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-03-30T18:40:14.583 回答
0

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

于 2017-06-08T05:58:27.187 回答
0

---不创建中间表

删除 FROM ORGINAL_TABLE WHERE (COL1, 2) in (select COL1, count( ) from ORGINAL_TABLE GROUP BY 1 HAVING COUNT( ) >1) 和 DUPLICATE_BASED_COL >1; --------删除一行(保留)

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

于 2019-10-02T14:21:49.660 回答