如何使用CTE删除重复行?

10 浏览
0 Comments

如何使用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

0
0 Comments

如何使用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来删除代码),请看一下。

0
0 Comments

删除重复行的原因是因为在数据中存在重复的记录,这可能会导致数据不准确或重复计算。为了解决这个问题,可以使用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()函数,我们可以轻松地识别和删除重复的记录,从而保证数据的准确性和一致性。

0