在 MySQL 中删除重复项时,DELETE 的目标表不可更新

发布于 2025-01-10 05:40:12 字数 654 浏览 1 评论 0原文

我正在使用 Windows 函数 Row_Number() 编写此查询,它将找出重复项,并且我正在尝试删除这些重复项。

为此,我编写了 CTE 并包含了窗口函数并尝试删除重复行。但是,我收到错误消息,说删除不可更新。

select * from housingdata;
.
.
.
with rownumcte as (
select * ,row_number() over (partition by ParcelID, PropertyAddress, 
SalePrice,saledate,LegalReference  order by UniqueID) as rownum
from housingdata)
delete 
from rownumcte
where rownum>1;

如果我使用 select 而不是 delete 我将得到以下包含重复项的输出,即 104 行

在此处输入图像描述

I am writing this query using windows function Row_Number() which will find out duplicates and i am trying to delete those duplicates.

To do this i have written CTE and included window function it and attempting to delete duplicate row. However, i am getting error saying delete is not updatable.

select * from housingdata;
.
.
.
with rownumcte as (
select * ,row_number() over (partition by ParcelID, PropertyAddress, 
SalePrice,saledate,LegalReference  order by UniqueID) as rownum
from housingdata)
delete 
from rownumcte
where rownum>1;

if i use select instead of delete i am getting following output containing duplicates which is 104 rows

enter image description here

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

少女七分熟 2025-01-17 05:40:12

是的,CTE 对于很多事情来说都非常好,但对于您的目的而言却并非如此。

请改用INNER JOIN

创建表 housingdata (UniqueID int, 
包裹 ID 整数
, 属性地址 varchar(50)
, 
销售价格 DECIMAL(10,2)
,发售日期
,法律参考 int)
INSERT INTO housingdata VALUES (1,1,'test',1.1, NOW(), 1),(2,1,'test',1.1, NOW(), 1)
删除高清
FROM housingdata hd 内连接

(
选择 UniqueID ,row_number() over (按 ParcelID、PropertyAddress 分区、 
SalePrice、saledate、LegalReference order by UniqueID) as rownum
来自住房数据) t1 ON hd.UniqueID = t1.UniqueID 
其中 t1.rownum>1;
从住房数据中选择 *
唯一ID |包裹ID |物业地址 |销售价格 |发售日期 |法律参考
--------: | --------: | :-------------- | --------: | :--------- | -------------:
       1 | 1 |测试| 1.10 | 1.10 2022年2月25日 | 1

db<>fiddle此处

更新

您也可以使用 CTE 作为连接表

其中 rownumcte 为 (
选择 UniqueID ,row_number() over (按 ParcelID、PropertyAddress 分区、 
SalePrice、saledate、LegalReference order by UniqueID) as rownum
来自住房数据)
删除高清
来自 housingdata hd INNER JOIN rownumcter ON hd.UniqueID = r.UniqueID
其中rownum>1;
从住房数据中选择 *
唯一ID |包裹ID |物业地址 |销售价格 |发售日期 |法律参考
--------: | --------: | :-------------- | --------: | :--------- | -------------:
       1 | 1 |测试| 1.10 | 1.10 2022年2月25日 | 1

db<>fiddle 此处

Yes CTE are for many things very good, but for your purpose not.

Use instead a INNER JOIN.

CREATE TABLE housingdata (UniqueID int, 
ParcelID int
, PropertyAddress varchar(50)
, 
SalePrice DECIMAL(10,2)
,saledate Date
,LegalReference int)
INSERT INTO housingdata VALUES (1,1,'test',1.1, NOW(), 1),(2,1,'test',1.1, NOW(), 1)
delete hd
FROM housingdata hd INNER JOIN

(
select UniqueID ,row_number() over (partition by ParcelID, PropertyAddress, 
SalePrice,saledate,LegalReference  order by UniqueID) as rownum
from housingdata) t1 ON hd.UniqueID = t1.UniqueID 
WHERE t1.rownum>1;
SELECT * FROM housingdata
UniqueID | ParcelID | PropertyAddress | SalePrice | saledate   | LegalReference
-------: | -------: | :-------------- | --------: | :--------- | -------------:
       1 |        1 | test            |      1.10 | 2022-02-25 |              1

db<>fiddle here

UPDATE

You could have used also the CTE as joined table

with rownumcte as (
select UniqueID ,row_number() over (partition by ParcelID, PropertyAddress, 
SalePrice,saledate,LegalReference  order by UniqueID) as rownum
from housingdata)
delete hd
from housingdata hd INNER JOIN rownumcte r ON hd.UniqueID = r.UniqueID
where rownum>1;
SELECT * FROM housingdata
UniqueID | ParcelID | PropertyAddress | SalePrice | saledate   | LegalReference
-------: | -------: | :-------------- | --------: | :--------- | -------------:
       1 |        1 | test            |      1.10 | 2022-02-25 |              1

db<>fiddle here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文