如何使用CTE删除重复行?
如何使用CTE删除重复行?
我想从我的表中删除重复的行。所以我使用了ROW_NUMBER()
函数来查找重复值。之后我想在查询中添加WHERE子句,所以我修改了查询并使用了"CTE",但是它给了我一个错误。
ORA-00928: 缺失 SELECT 关键字
这是一个对于我的用例成功运行的查询:
WITH RowNumCTE as ( SELECT ID,parcelid,propertyaddress,saledate,saleprice,legalreference, ROW_NUMBER() OVER ( PARTITION BY parcelid,propertyaddress,saledate,saleprice,legalreference ORDER BY id ) AS rn FROM housedata ) SELECT * FROM RowNumCTE
如何使用CTE(公共表达式)来删除重复行?
如果这五个列构成了所需删除的分组条件,并且id是一个主键列,那么你需要以下代码:
BEGIN FOR d IN ( SELECT ROW_NUMBER() OVER ( PARTITION BY parcelid,propertyaddress,saledate,saleprice,legalreference ORDER BY id ) AS rn, h.* FROM housedata h ) LOOP IF d.rn > 1 THEN DELETE housedata WHERE id = d.id; END IF; END LOOP; COMMIT; END; /
但是这给我一个PL/SQL编译错误。
你遇到了什么错误?
ORA-06550: line 13, column 5: PL/SQL: ORA-00933: SQL command not properly ended ORA-06550: line 12, column 8: PL/SQL: SQL Statement ignored ORA-06550: line 14, column 7: PLS-00103: Encountered the symbol "LOOP" when expecting one of the following: if ORA-06550: line 16, column 8: PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following: end not pragma final instantiable order overriding static member constructor map 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error.
请确保语句中的分号是否正确。
我已经编辑了你的问题(修复了CTE,因为你不需要CTE来删除代码),请看一下。
你在WHERE id = d.id END IF;
中缺少一个分号。
然后,请确保分号是否正确。
我已经编辑了你的问题(修复了CTE,因为你不需要CTE来删除代码),请看一下。
删除重复行的原因是因为在数据中存在重复的记录,这可能会导致数据不准确或重复计算。为了解决这个问题,可以使用CTE(公共表表达式)来删除重复行。
使用CTE删除重复行的方法如下:
1. 创建一个CTE,将需要删除重复行的表作为基础查询。
2. 在CTE内部,使用ROW_NUMBER()函数对每个记录进行编号,按照指定的列进行分组和排序。
3. 在CTE的结果中,选择行号大于1的记录,这些记录即为重复的行。
4. 最后,使用DELETE语句将CTE中选定的重复行从原始表中删除。
下面是使用CTE删除重复行的代码示例:
delete housedata where id in ( with cte as ( select id , row_number() over(partition by parcelid, propertyaddress, saledate, saleprice, legalreference order by id) as rn from housedata ) select id from cte where rn > 1 );
以上就是使用CTE删除重复行的方法。通过使用CTE和ROW_NUMBER()函数,我们可以轻松地识别和删除重复的记录,从而保证数据的准确性和一致性。