日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

数据库去重有几种方法_去重数据库(常用的数据网站汇总)

發(fā)布時(shí)間:2023/12/19 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 数据库去重有几种方法_去重数据库(常用的数据网站汇总) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

概述

一、Oracle數(shù)據(jù)庫(kù)去重(推薦放在在第6點(diǎn))

二、MySQL數(shù)據(jù)庫(kù)去重

三、sqlserver數(shù)據(jù)庫(kù)去重

四、pg數(shù)據(jù)庫(kù)刪除重復(fù)數(shù)據(jù)


概述


轉(zhuǎn)發(fā)這個(gè)主要是有時(shí)會(huì)有重復(fù)數(shù)據(jù)的需求,留一個(gè)查詢方法,大家有空也可以測(cè)試一下..


一、Oracle數(shù)據(jù)庫(kù)去重(推薦放在在第6點(diǎn))

1、環(huán)境準(zhǔn)備

可以看到“ALLEN”和“SMITH”這兩個(gè)人的數(shù)據(jù)重復(fù)了,現(xiàn)在要求表中name重復(fù)的數(shù)據(jù)只保留一行,其他的刪除。

CREATE TABLE hwb(
    id int,
    name varchar(10)
);

INSERT INTO hwb VALUES(1, 'TOM');
INSERT INTO hwb VALUES(2, 'ALLEN');
INSERT INTO hwb VALUES(3, 'ALLEN');
INSERT INTO hwb VALUES(4, 'SMITH');
INSERT INTO hwb VALUES(5, 'SMITH');
INSERT INTO hwb VALUES(6, 'SMITH');
commit;
SELECT * FROM hwb;

2、實(shí)現(xiàn)方法一:通過(guò)分組后,拿最小的id重復(fù)刪除

delete from hwb a where a.id  in      
   (select min(id) FROM hwb a group by name having count(name) > 1)

3、實(shí)現(xiàn)方法二:通過(guò)name相同,id不同的方式來(lái)判斷

DELETE FROM hwb a
 WHERE EXISTS (SELECT 1
          FROM hwb b
         WHERE a.name = b.name
           AND a.id > b.id);

4、實(shí)現(xiàn)方法三:用rowid代替id,替換刪除

DELETE FROM hwb a
 WHERE EXISTS (SELECT 1
          FROM hwb b
         WHERE a.name = b.name
           AND a.rowid > b.rowid);

5、實(shí)現(xiàn)方法四:通過(guò)分析函數(shù)根據(jù)name分組生成序號(hào),然后刪除序號(hào)大于1的數(shù)據(jù)。

語(yǔ)法格式:row_number() over(partition by 分組列 order by 排序列 desc)

在使用 row_number() over()函數(shù)時(shí)候,over()里頭的分組以及排序的執(zhí)行晚于 where 、group by、 order by 的執(zhí)行。

DELETE FROM hwb a
WHERE ROWID IN (SELECT rid
                   FROM (SELECT ROWID as rid,
                                ROW_NUMBER() OVER(PARTITION BY name ORDER BY id) AS seq
                           FROM hwb)
                  WHERE seq > 1);

6、【推薦】實(shí)現(xiàn)方法五:根據(jù)rowid刪除

DELETE FROM hwb a
 WHERE a.ROWID > (SELECT MIN(b.ROWID) FROM hwb b WHERE a.name = b.name);


二、MySQL數(shù)據(jù)庫(kù)去重

1、環(huán)境準(zhǔn)備

CREATE TABLE hwb(
    id BIGINT (4) not null,
    name varchar(10),
    PRIMARY KEY (id) 
) ENGINE = INNODB;

INSERT INTO hwb VALUES(1, 'TOM');
INSERT INTO hwb VALUES(2, 'ALLEN');
INSERT INTO hwb VALUES(3, 'ALLEN');
INSERT INTO hwb VALUES(4, 'SMITH');
INSERT INTO hwb VALUES(5, 'SMITH');
INSERT INTO hwb VALUES(6, 'SMITH');
commit;
SELECT * FROM hwb;

2、實(shí)現(xiàn)方法一:通過(guò)分組后,拿最大/最小的id重復(fù)刪除

--重復(fù)刪除多次
delete from hwb 
where id in (select id from 
       (select max(b.id) as id FROM hwb b group by name having count(name) > 1)c )

--或者修改為以下,只需刪除一次
delete from hwb 
WHERE
NAME IN (select name from ( SELECT NAME FROM hwb b GROUP BY NAME HAVING count( NAME ) > 1 ) t)
AND id NOT IN (select tt.id from (SELECT max(c.id ) as id FROM hwb c GROUP BY NAME HAVING count( NAME ) > 1 ) tt)

3、實(shí)現(xiàn)方法二:

根據(jù)name分組,查找出id最小的,然后再查找id不包含剛才查出來(lái)的。這樣就查詢出了所有的重復(fù)數(shù)據(jù)(除了id最小的那行)

delete from hwb 
WHERE
 id NOT IN (select tt.id from (SELECT min(c.id ) as id FROM hwb c GROUP BY NAME ) tt)

4、實(shí)現(xiàn)方法三:通過(guò)name相同,id不同的方式來(lái)判斷

delete  from hwb  where  id in ( 
select id from (
select * from hwb a
WHERE EXISTS (SELECT 1
          FROM hwb b
         WHERE a.name = b.name
           AND a.id > b.id))c );

5、實(shí)現(xiàn)方法四:用rowid代替id,替換刪除

在 Oracle 數(shù)據(jù)庫(kù)的表中的每一行數(shù)據(jù)都有一個(gè)唯一的標(biāo)識(shí)符,稱為 rowid ,在 Oracle 內(nèi)部通常就是使用它來(lái)訪問(wèn)數(shù)據(jù)的。

而在 MySQL 中也有一個(gè)類似的隱藏列 _rowid 來(lái)標(biāo)記唯一的標(biāo)識(shí)。但是需要注意 _rowid 并不是一個(gè)真實(shí)存在的列,其本質(zhì)是一個(gè) 非空唯一列 的別名。

在某些情況下 _rowid 是不存在的,其只存在于以下情況:

1)當(dāng)表中存在一個(gè) 數(shù)字類型 的單列主鍵時(shí), _rowid 其實(shí)就是指的是這個(gè)主鍵列

2)當(dāng)表中 不存在主鍵 但存在一個(gè) 數(shù)字類型 的 非空唯一列 時(shí), _rowid 其實(shí)就是指的是對(duì)應(yīng) 非空唯一列 。

需要注意以下情況是不存在 _rowid 的

1)主鍵列 或者 非空唯一列 的類型不是 數(shù)字類型

2)主鍵 是聯(lián)合主鍵

3)唯一 列不是非空的。

delete  from hwb  where  id in ( 
select id from (
select * from hwb a
WHERE EXISTS (SELECT 1
          FROM hwb b
         WHERE a.name = b.name
           AND a._rowid > b._rowid))c );

ps:還可考慮表切換完成去重步驟。


三、sqlserver數(shù)據(jù)庫(kù)去重

1、環(huán)境準(zhǔn)備

CREATE TABLE [dbo].[hwb] (
  [id] decimal(12)   NULL,
  [name] nvarchar(10) COLLATE Chinese_PRC_CI_AS  NOT NULL
)
GO

ALTER TABLE [dbo].[hwb] SET (LOCK_ESCALATION = TABLE)
GO

INSERT INTO hwb VALUES(1, 'TOM');
INSERT INTO hwb VALUES(2, 'ALLEN');
INSERT INTO hwb VALUES(3, 'ALLEN');
INSERT INTO hwb VALUES(4, 'SMITH');
INSERT INTO hwb VALUES(5, 'SMITH');
INSERT INTO hwb VALUES(6, 'SMITH');
GO

2、實(shí)現(xiàn)方法一:通過(guò)分組后,拿最大/最小的id重復(fù)刪除

--重復(fù)刪除多次
delete from hwb 
 where id  in
       (select min(id) FROM hwb a group by name having count(name) > 1)

--或者修改為以下,只需刪除一次
select * from hwb 
-- delete from hwb
WHERE
NAME IN (SELECT NAME FROM hwb b GROUP BY NAME HAVING count( NAME ) > 1 )
AND id NOT IN (SELECT max(c.id ) as id FROM hwb c GROUP BY NAME HAVING count( NAME ) > 1 )

3、實(shí)現(xiàn)方法二:根據(jù)name分組,查找出id最小的,然后再查找id不包含剛才查出來(lái)的

這樣就查詢出了所有的重復(fù)數(shù)據(jù)(除了id最小的那行)

delete from hwb 
WHERE
 id NOT IN (select tt.id from (SELECT min(c.id ) as id FROM hwb c GROUP BY NAME ) tt)

4、實(shí)現(xiàn)方法三:通過(guò)name相同,id不同的方式來(lái)判斷

DELETE FROM hwb a
 WHERE EXISTS (SELECT 1
          FROM hwb b
         WHERE a.name = b.name
           AND a.id > b.id);

5、實(shí)現(xiàn)方法四:用hash值代替id,替換刪除

%%lockres%%會(huì)返回聚集索引鍵的hash值,

非聚集索引,%%lockres%%會(huì)返回非聚集索引鍵的hash值

delete from hwb a
 WHERE EXISTS (SELECT 1
          FROM hwb b
         WHERE a.name = b.name
           AND a.%%lockres%% > b.%%lockres%%);

6、實(shí)現(xiàn)方法五:通過(guò)分析函數(shù)根據(jù)name分組生成序號(hào),然后刪除序號(hào)大于1的數(shù)據(jù)。

語(yǔ)法格式:row_number() over(partition by 分組列 order by 排序列 desc)

在使用 row_number() over()函數(shù)時(shí)候,over()里頭的分組以及排序的執(zhí)行晚于 where 、group by、 order by 的執(zhí)行。

DELETE FROM hwb a
WHERE
	id IN (
	SELECT	b.id 
	FROM	(SELECT id, ROW_NUMBER () OVER ( PARTITION BY name ORDER BY id ) AS seq FROM hwb) b 
	WHERE	b.seq > 1 );

7、【推薦】實(shí)現(xiàn)方法六:根據(jù)hash值刪除

DELETE FROM hwb a
 WHERE a.%%lockres%% > (SELECT MIN(b.%%lockres%%) FROM hwb b WHERE a.name = b.name);


四、pg數(shù)據(jù)庫(kù)刪除重復(fù)數(shù)據(jù)

1、環(huán)境準(zhǔn)備

set search_path to 'public'; 
\dt   --list tables
CREATE TABLE hwb(
    id INT PRIMARY KEY  NOT NULL,
    name CHAR(10));

INSERT INTO hwb VALUES(1, 'TOM');
INSERT INTO hwb VALUES(2, 'ALLEN');
INSERT INTO hwb VALUES(3, 'ALLEN');
INSERT INTO hwb VALUES(4, 'SMITH');
INSERT INTO hwb VALUES(5, 'SMITH');
INSERT INTO hwb VALUES(6, 'SMITH');
SELECT * FROM hwb;

2、實(shí)現(xiàn)方法一:通過(guò)分組后,拿最大/最小的id重復(fù)刪除

--重復(fù)刪除多次
delete from hwb 
where id in (select max(b.id) as id FROM hwb b group by name having count(name) > 1)

--或者修改為以下,只需刪除一次
delete  from hwb 
WHERE
NAME IN (SELECT NAME FROM hwb b GROUP BY NAME HAVING count(NAME) > 1)
AND id NOT IN (SELECT max(c.id ) as id FROM hwb c GROUP BY NAME HAVING count( NAME ) > 1);

3、實(shí)現(xiàn)方法二:

根據(jù)name分組,查找出id最小的,然后再查找id不包含剛才查出來(lái)的。這樣就查詢出了所有的重復(fù)數(shù)據(jù)(除了id最小的那行)

delete  from hwb 
WHERE id NOT IN (SELECT min(c.id ) as id FROM hwb c GROUP BY NAME );

4、實(shí)現(xiàn)方法三:通過(guò)name相同,id不同的方式來(lái)判斷

delete from hwb a
WHERE EXISTS (SELECT 1
          FROM hwb b
         WHERE a.name = b.name
           AND a.id > b.id);

5、[推薦]實(shí)現(xiàn)方法四:用ctid代替id,替換刪除

delete from hwb a
WHERE EXISTS (SELECT 1 FROM hwb b
WHERE a.name = b.name AND a.ctid > b.ctid);

--或者如下:
select * from hwb WHERE ctid NOT IN (SELECT min(ctid) as id FROM hwb GROUP BY NAME );

6、[最高效推薦]實(shí)現(xiàn)方法五:用ctid代替id,結(jié)合row_number替換刪除

delete FROM hwb a WHERE a.ctid = 
ANY (array (SELECT ctid FROM (SELECT row_number() over(PARTITION BY NAME) as seq, ctid FROM hwb ) t 	
WHERE t.seq > 1));

本文轉(zhuǎn)載至頭條用戶“波波說(shuō)運(yùn)維”

總結(jié)

以上是生活随笔為你收集整理的数据库去重有几种方法_去重数据库(常用的数据网站汇总)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。