【问题标题】:How to remove duplicate rows using CTE?如何使用 CTE 删除重复行?
【发布时间】:2021-08-18 01:39:26
【问题描述】:

我想从我的表中删除重复的行。所以我使用了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

【问题讨论】:

  • 不添加where rn = 1 工作?

标签: sql oracle


【解决方案1】:

我认为你需要

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;    
/

考虑到这五列构成了所需删除的分组条件,id 是一个主键列。

【讨论】:

  • 谢谢。但这给了我一个 PL/SQL 编译错误
  • 嗨@MohammadLitonHossain,你遇到了什么错误?
  • ORA-06550:第 13 行,第 5 列:PL/SQL:ORA-00933:SQL 命令未正确结束 ORA-06550:第 12 行,第 8 列:PL/SQL:忽略 SQL 语句 ORA- 06550:第 14 行,第 7 列:PLS-00103:在预期以下情况之一时遇到符号“LOOP”:如果 ORA-06550:第 16 行,第 8 列:PLS-00103:遇到符号“文件结尾”预期以下情况之一时:结束而不是编译指示最终实例化顺序覆盖静态成员构造函数映射 06550。00000 -“行 %s,列 %s:\n%s” *原因:通常是 PL/SQL 编译错误。
  • BEGIN FOR d IN (SELECT ROW_NUMBER() OVER (PARTITION BY parcelid,propertysplitaddress,saleprice,legalreference ORDER BY id) AS rn, h.* FROM housedata h) LOOP IF d.rn > 1 THEN从 housedata 中删除其中 id = d.id END IF;结束循环;犯罪;结尾;我已经做了但是没有用
  • PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:结束而不是编译指示最终实例化顺序覆盖静态成员构造函数映射 06550。00000 -“行 %s,列%s:\n%s" *原因:通常是 PL/SQL 编译错误。
【解决方案2】:

删除重复项:

delete housedata where rowid in
       ( select lead(rowid) over (partition by parcelid, propertyaddress, saledate, saleprice, legalreference order by id)
         from   housedata );

使用 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 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-22
    • 2020-10-21
    • 2014-11-11
    • 2022-06-14
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    相关资源
    最近更新 更多