sql删除重复数据(多个KEY值)

本文详细介绍如何使用SQL语句处理数据库中重复数据的问题,包括创建临时表进行数据筛选,执行删除操作去除重复项,并通过具体实例展示如何在特定场景下实现数据去重。

sql删除重复数据(多个KEY值)

sql删除重复数据(多个KEY值)

// 创建一个临时表
select key1,key2 INTO #aaa from 表名 group by key1,key2 having count(*) > 1
//执行删除
DELETE FROM 表名 WHERE key1 IN(SELECT key1 FROM #aaa) 
 AND key2 IN(SELECT key2 FROM #aaa) 
 AND INDX NOT IN(SELECT  MIN(INDX) from 表名 group by key1,key2 having count(*) > 1)
--集报出口去重复
select STOCKOUT_NO,STOCKOUT_LINE_NO,TRAN_TYPE_CODE,RESERVER5 INTO #aaa from BMS_PROCESS_OUT group by STOCKOUT_NO,STOCKOUT_LINE_NO,TRAN_TYPE_CODE,RESERVER5 having count(*) > 1

SELECT *  FROM BMS_PROCESS_OUT WHERE STOCKOUT_NO IN(SELECT STOCKOUT_NO FROM #aaa) 
 AND STOCKOUT_LINE_NO IN(SELECT STOCKOUT_LINE_NO FROM #aaa)
 AND TRAN_TYPE_CODE IN(SELECT TRAN_TYPE_CODE FROM #aaa)
 AND RESERVER5 IN(SELECT RESERVER5 FROM #aaa)
 AND INDX NOT IN(SELECT  MIN(INDX) from BMS_PROCESS_OUT group by STOCKOUT_NO,STOCKOUT_LINE_NO,TRAN_TYPE_CODE,RESERVER5 having count(*) > 1)

查询重复数据
SELECT H_INDX,
                 GDSSEQNO,
               COUNT(1) AS num
        FROM dbo.BSWL_NEMS_LIST
        GROUP BY H_INDX,
                 GDSSEQNO
        HAVING COUNT(1) > 1

SELECT L.*
FROM dbo.BSWL_NEMS_LIST L
    INNER JOIN
    (
        SELECT H_INDX,
                 GDSSEQNO,
               COUNT(1) AS num
        FROM dbo.BSWL_NEMS_LIST
        GROUP BY H_INDX,
                 GDSSEQNO
        HAVING COUNT(1) > 1
    ) T
        ON L.H_INDX = T.H_INDX
           AND L.GDSSEQNO = T.GDSSEQNO
     ORDER BY L.H_INDX,L.GDSSEQNO
SQL 中,如果需要删除多个数据表中的数据,可以通过以下几种方法实现。根据不同的场景和需求,可以选择适合的方式。 ### 使用 `DELETE` 语句逐个删除 可以使用多个 `DELETE` 语句分别删除不同表中的数据。这种方法适用于表数量较少的情况,并且能够灵活控制每个表的删除条件: ```sql DELETE FROM table1 WHERE condition; DELETE FROM table2 WHERE condition; ``` ### 使用 `JOIN` 删除关联数据(特定数据库) 某些数据库系统(如 SQL Server 和 PostgreSQL)支持通过 `JOIN` 来删除与其他表关联的数据。这种方法可以一次性删除多个相关联的表中的数据: ```sql DELETE FROM table1 USING table1 JOIN table2 ON table1.id = table2.foreign_key_id WHERE condition; ``` 需要注意的是,这种语法可能因数据库系统而异,具体实现需参考所用数据库文档[^2]。 ### 使用存储过程批量删除 对于需要频繁执行的多表删除操作,可以编写一个存储过程来封装这些操作。这样可以在未来直接调用存储过程,而不需要重复输入相同的命令: ```sql CREATE PROCEDURE DeleteMultipleTables() BEGIN DELETE FROM table1 WHERE condition; DELETE FROM table2 WHERE condition; -- 添加更多表的操作 END; -- 调用存储过程 CALL DeleteMultipleTables(); ``` ### 使用事务管理确保一致性 当删除操作涉及多个表时,建议将所有删除操作放在一个事务中,以保证数据的一致性。如果某一步失败,整个事务都可以回滚,避免部分删除导致的数据不一致问题: ```sql START TRANSACTION; DELETE FROM table1 WHERE condition; DELETE FROM table2 WHERE condition; COMMIT; -- 如果一切顺利,则提交事务 -- 或者 ROLLBACK; -- 如果有错误,则回滚事务 ``` ### 注意事项 - **备份数据**:在执行任何删除操作之前,请确保已经对重要数据进行了备份。 - **测试查询**:在实际执行删除前,先使用 `SELECT` 查询确认目标数据是否符合预期。 - **权限检查**:确保有足够的权限执行删除操作。 - **索引优化**:大量数据删除时,考虑索引的影响并适当优化性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值