create table SAMPLE_TEST
(
product_id NUMBER,
product_name VARCHAR2(100),
product_price NUMBER(10,2),
product_desc VARCHAR2(2000)
);
comment on table SAMPLE_TEST
is '产品信息表';
comment on column SAMPLE_TEST.product_id
is '产品代码';
comment on column SAMPLE_TEST.product_name
is '产品名称';
comment on column SAMPLE_TEST.product_price
is '产品价格';
comment on column SAMPLE_TEST.product_desc
is '产品介绍';
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (1, 'iPhone 11 Pro Max', 9800.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (1, 'iPhone 11 Pro Max', 9800.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (2, 'iPhone 12 Pro Max', 10888.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (2, 'iPhone 12 Pro Max', 10888.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (3, 'iPhone 13 Pro Max', 11888.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (3, 'iPhone 13 Pro Max', 11888.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (3, 'iPhone 13 Pro Max', 11888.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (4, 'iPhone 14 Pro Max', 12888.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (4, 'iPhone 14 Pro Max', 12888.00, '手机');
commit;
insert into sample_test (PRODUCT_ID, PRODUCT_NAME, PRODUCT_PRICE, PRODUCT_DESC)
values (4, 'iPhone 14 Pro Max', 12888.00, '手机');
commit;
问题: 现需要去除重复数据,要求所有数据无论重复多少次, 只保留一条.
具体实现流程如下:
SELECT ROW_NUMBER() OVER(PARTITION BY t.product_id, t.product_name, t.product_price ORDER BY t.rowid) rn,
t.*
FROM sample_test t;
建议在删除数据前, 先查询一下, 确认查询结果, 判断where条件是否正确, 防止出现事故
SELECT *
FROM sample_test t1
WHERE EXISTS (SELECT 1
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY t.product_id, t.product_name, t.product_price ORDER BY t.rowid)rn,
t.*
FROM sample_test t) t2
WHERE t2.rn > 1
AND t1.rowid = t2.rowid);
确认查询结果是需要删除的数据范围, 复制查询条件到Delete语句
注意‼ : 如果是生产库要记得备份数据, 同时在处理删除之前, 要想好恢复数据的方法
DELETE FROM sample_test t1
WHERE EXISTS (SELECT 1
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY t.product_id, t.product_name, t.product_price ORDER BY t.rowid)rn,
t.*
FROM sample_test t) t2
WHERE t2.rn > 1
AND t1.rowid = t2.rowid);
SELECT MIN(t.rowid) min_rowid FROM sample_test t GROUP BY t.product_id;
保留此rowid对应的数据, 不在此范围内的数据删除, 先查询一下是否正确
SELECT *
FROM sample_test t1
WHERE NOT EXISTS
(SELECT 1
FROM (SELECT MIN(t.rowid) min_rowid FROM sample_test t GROUP BY t.product_id) t2
WHERE t1.rowid = t2.min_rowid);
确认查询结果是需要删除的数据范围, 复制查询条件到Delete语句
注意‼ : 如果是生产库要记得备份数据, 同时在处理删除之前, 要想好恢复数据的方法
DELETE
FROM sample_test t1
WHERE NOT EXISTS
(SELECT 1
FROM (SELECT MIN(t.rowid) min_rowid FROM sample_test t GROUP BY t.product_id) t2
WHERE t1.rowid = t2.min_rowid);
当然还有其他方法, 以上是我平时工作中比较常用的且的方法. 比较喜欢用第一种, 因为有的时候, 实际上是在生产库中处理数据, 需求比较复杂.
更新时间:2024-09-05
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号