首頁 > 資料庫 > mysql教程 > 如何從沒有主鍵的SQL表中刪除重複記錄?

如何從沒有主鍵的SQL表中刪除重複記錄?

Barbara Streisand
發布: 2025-01-03 03:13:40
原創
141 人瀏覽過

How to Delete Duplicate Records from an SQL Table Without a Primary Key?

處理沒有主鍵的SQL 表中的重複記錄

在沒有主鍵的情況下,可以從SQL 表中刪除重複記錄具有挑戰性的。讓我們考慮以下場景:

名為「employee」的表包含以下沒有主鍵的記錄:

create table employee
(
 EmpId number,
 EmpName varchar2(10),
 EmpSSN varchar2(11)
);

insert into employee values(1, 'Jack', '555-55-5555');
insert into employee values (2, 'Joe', '555-56-5555');
insert into employee values (3, 'Fred', '555-57-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');
insert into employee values (1, 'Jack', '555-55-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6 ,'Lisa', '555-70-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');
登入後複製

給定此表,目標是刪除重複記錄,同時保留獨特的。為了實現這一點,我們可以使用「ROW_NUMBER()」函數和「DELETE」語句的組合:

DELETE SUB FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY EmpId, EmpName, EmpSSN ORDER BY EmpId) cnt
 FROM Employee) SUB
WHERE SUB.cnt > 1
登入後複製

分解程式碼:

  • 內部查詢使用ROW_NUMBER() 函數為每組重複記錄的每一行分配一個序號。 PARTITION BY 子句按 EmpId、EmpName 和 EmpSSN 欄位對資料進行分區,ORDER BY EmpId 確保行按 EmpId 的升序編號。
  • 外部查詢使用內部查詢中的 cnt 欄位作為僅選擇重複行的篩選器 (cnt > 1)。
  • DELETE 語句使用子查詢從原始表中刪除重複的行。

透過執行此查詢,「employee」表中的重複記錄將被刪除,只留下唯一的記錄:

select * from employee;

EmpId EmpName EmpSSN
1      Jack   555-55-5555
2      Joe    555-56-5555
3      Fred   555-57-5555
4      Mike   555-58-5555
5      Cathy  555-59-5555
6      Lisa   555-70-5555
登入後複製

以上是如何從沒有主鍵的SQL表中刪除重複記錄?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板