删除内表里重复行的方法

今天看OMYGOD博客里学到的一条语句,用于删除内表里的重复行.."DELETE ADJACENT DUPLICATES FROM..." 更准确的说应该是"删除相邻重复行"

eg:

DATA: BEGIN OF wa_deldup,

  one LIKE i,

  two LIKE i,

  three LIKE i,

  four LIKE i,

END OF wa_deldup.


DATA: itab_deldup LIKE TABLE OF wa_deldup WITH HEADER LINE.


* 进行删除前要将ITAB进行排序..因为此语句只是删除相邻的重复行..

SORT itab_deldup BY one.


DELETE ADJACENT DUPLICATES FROM itab_deldup.


----------
同时还犯了个错误..关于COLLECT

COLLECT在加入独立LINE时相当于APPEND,但如果跟ITAB里LINE重复,则累加LINE值..(不产生重复行)

### 删除数据库表中的重复记录 在数据库中删除重复记录时,通常需要根据一个或多个字段判断哪些记录是重复的,并保留唯一一条记录。以下是几种常见的方法,适用于不同的场景。 #### 根据单个字段删除重复记录 假设有一个名为 `people` 的表,其中包含 `peopleId` 字段,希望删除基于该字段的重复记录,只保留 `rowid` 最小的那条记录。 ```sql DELETE FROM people WHERE peopleId IN ( SELECT peopleId FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1 ) AND rowid NOT IN ( SELECT MIN(rowid) FROM people GROUP BY peopleId HAVING COUNT(peopleId) > 1 ); ``` 此查询首先找到所有重复的 `peopleId`,然后删除这些记录中 `rowid` 不是最小值的记录[^1]。 #### 根据多个字段删除重复记录 假设有一个名为 `test` 的表,其中包含 `name` 和其他字段,希望删除基于 `name` 的重复记录,同样保留 `rowid` 最小的那条记录。 ```sql DELETE FROM test WHERE rowid NOT IN ( SELECT r FROM ( SELECT DISTINCT z.name, MIN(z.rowid) AS r FROM test z GROUP BY z.name ) c ); ``` 这种方法通过子查询找到每个 `name` 对应的最小 `rowid`,并删除不在这些 `rowid` 列表中的记录[^4]。 #### 使用窗口函数删除重复记录 如果数据库支持窗口函数(如 PostgreSQL 或 SQL Server),可以使用 `ROW_NUMBER()` 函数来删除重复记录。以下是一个示例,假设表名为 `orders`,并且希望根据 `customer_id` 和 `order_date` 删除重复记录: ```sql DELETE FROM orders WHERE rowid IN ( SELECT rowid FROM ( SELECT rowid, ROW_NUMBER() OVER (PARTITION BY customer_id, order_date ORDER BY rowid) AS rn FROM orders ) t WHERE rn > 1 ); ``` 此查询为每组重复记录分配一个号,然后删除号大于 1 的记录[^3]。 #### 使用 GROUP BY 和 DISTINCT 去重 另一种方法是通过创建新表来去除重复数据,适用于较小的数据集。例如: ```sql CREATE TABLE new_table AS SELECT DISTINCT * FROM old_table; DROP TABLE old_table; RENAME TABLE new_table TO old_table; ``` 此方法利用了 `DISTINCT` 关键字去重,并重新创建原始表。 ### 注意事项 - 在执删除操作之前,请确保备份数据以防止意外丢失重要信息。 - 如果表中存在大量数据,建议在时间字段上创建索引以提高性能[^1]。 - 不同数据库系统可能有不同的语法和支持的功能,请根据具体环境调整查询语句。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值