[英]Delete duplicates in mySQL table
我正在嘗試編寫我的第一個mySQL查詢。 如果它們具有相同的商品編號字段,則需要刪除它們。 我寫了這個查詢:
SELECT
article_number, COUNT(*)
FROM
article_numbers
GROUP BY
article_number
HAVING
COUNT(*) > 1
它顯示了所有重復的行。 但是,如何刪除每個重復項中除了1之外的所有內容?
謝謝
編輯:
我試過這個查詢:
delete article_numbers from article_numbers inner join
(select article_number
from article_numbers
group by article_number
having count(1) > 1) as duplicates
on (duplicates.article_number = article_numbers.article_number)
但這給了我這個錯誤:
無法刪除或更新父行:外鍵約束失敗(
api
products
,CONSTRAINTproducts_article_number_id_foreign
FOREIGN KEY(article_number_id
)參考article_numbers
(id
))
編輯2:
我暫時禁用了外鍵,現在刪除查詢起作用了。 但是,如何修改不刪除重復行之一?
使用CROSS JOIN
。
詢問
delete t1
from article_numbers t1,
article_numbers t2
where t1.id > t2.id
and t1.article_number = t2.article_number;
我使用一個相當簡單的查詢來刪除重復項:
;WITH DEDUPE AS (
SELECT ROW_NUMBER() OVER(
PARTITION BY article_number
ORDER BY (SELECT 1)) AS RN
FROM article_numbers)
DELETE FROM DEDUPE
WHERE RN != 1
Delete c
from (select *,rank() over(order by article_number) as r from article_numbers )c
where c.r!=1
如果存在相同的article_number但具有更高的ID,則刪除一行:
delete from article_numbers t1
where exists (select 1 from article_numbers t2
where t2.article_number = t1.article_number
and t2.id > t1.id)
核心ANSI SQL,因此我想它可與MySQL和SQL Server一起使用。
我認為這會有所幫助:
WITH tblTemp as
(
SELECT ROW_NUMBER() Over(PARTITION BY Name,Department ORDER BY Name)
As RowNumber,* FROM <table_name>
)
DELETE FROM tblTemp where RowNumber >1
我修改了查詢,並認為現在可以使用:
SET FOREIGN_KEY_CHECKS=0;
delete article_numbers from article_numbers inner join
(select min(id) minid, article_number
from article_numbers
group by article_number
having count(1) > 1) as duplicates
on (duplicates.article_number = article_numbers.article_number and duplicates.minid <> article_numbers.id)
但這似乎很復雜。 我將檢查@Ullas方法,以查看它是否也有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.