1. 程式人生 > >Oracle 去重複的資料

Oracle 去重複的資料

重複的資料分兩種,一種是表中部分欄位的重複,一種是兩行以上的記錄完全一樣。

  • 部分欄位的重複:
查詢不重複的資料SQL: select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) = 1
部分欄位重複資料的刪除: 查詢重複的資料SQL select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) > 1 刪除上面查詢出的重複的資料: delete from 表名 a where 欄位1,欄位2 in     (select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) > 1) 以上即是刪除查詢到的資料,這種刪除執行效率低下,資料量大時,不適合。 另一種方法是先將查詢到的重複的資料插入到一張臨時表,然後對其進行刪除,這樣,在執行刪除的時候就不用再進行一次查詢了。 CREATE TABLE 臨時表 AS (select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) > 1) --建立臨時表,並將查詢到的資料插入其中。 再進行刪除操作: delete from 表名 a where 欄位1,欄位2 in (select 欄位1,欄位2 from 臨時表);
這種先建臨時表再進行刪除的操作要比直接用一條語句進行刪除高效得多。 以上是把所有的重複的資料全都刪除,沒有保留重複資料的其中一條記錄。 如何保留重複資料的其中一條記錄? 在oracle中,有個隱藏了欄位為rowid,表中每條記錄都有一個唯一的rowid, 如果想保留最新一條記錄,可以利用這個欄位,保留重複資料中rowid最大的一條記錄就可以了 以下括號中是查詢出重複資料中rowid最大的一條記錄,括號外是查詢出除了rowid最大之外的其他重複的資料: select a.rowid,a.* from 表名 a where a.rowid != (    select max(b.rowid) from 表名 b    where a.欄位1 = b.欄位1 and    a.欄位2 = b.欄位2 ) 要刪除重複資料,只保留最新的一條資料:
delete from 表名 a where a.rowid != (    select max(b.rowid) from 表名 b    where a.欄位1 = b.欄位1 and    a.欄位2 = b.欄位2 ) 以上即是刪除查詢到重複的資料,保留最新一條記錄,這種刪除執行效率低下,資料量大時,不適合。
考慮建立臨時表,將需要判斷重複的欄位,rowid插入到臨時表中,然後刪除的時候再進行比較。 create table 臨時表 as     select a.欄位1,a.欄位2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.欄位1,a.欄位2; delete from 表名 a where a.rowid != (    select b.dataid from 臨時表 b    where a.欄位1 = b.欄位1 and    a.欄位2 = b.欄位2 );
  • 完全重複記錄的刪除:

對於表中兩行或以上的記錄完全一樣的情況,可以使用以下語句獲取到去掉重複資料後的記錄: select distinct * from 表名
將查詢的記錄放進臨時表,然後再將原來的表記錄刪除,最後將臨時表的資料導回原來的表中。 CREATE TABLE 臨時表 AS (select distinct * from 表名); truncate table 正式表; insert into 正式表 (select * from 臨時表); drop table 臨時表;

相關推薦

oracle重複資料的處理方法

1。DISTINCT 方法就不必說了,大家都清楚。(主要是我用不上,用了下面的方法) 2。通過查詢方法來取得不重複資料 -- 根據去重複的欄位來查詢資料的第一個ID進行匹配 select * from FM_COALBLENDING_QUALITY where hea

oracle重複資料(轉)

重複的資料分兩種,一種是表中部分欄位的重複,一種是兩行以上的記錄完全一樣。 部分欄位的重複: 查詢不重複的資料SQL: select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) = 1

Oracle 重複資料

重複的資料分兩種,一種是表中部分欄位的重複,一種是兩行以上的記錄完全一樣。 部分欄位的重複: 查詢不重複的資料SQL: select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) = 1

oracle查詢重複資料出現次數

話不多數上程式碼:   我在Oracle資料庫查資料,發現重複資料,於是我想把重複條數以及具體資料查出來:     下面是資料      然後我需要知道重複多少條 (重複十條,也就是有五條資料相同)   SQL: select COUNT(*) from acsprd.parameters_

Oracle刪除重複資料並且只留其中一條資料

資料庫操作中,經常會因為導資料造成資料重複,需要進行資料清理,去掉冗餘的資料,只保留正確的資料 一:重複資料根據單個欄位進行判斷 1、首先,查詢表中多餘的資料,由關鍵欄位(name)來查詢。 select * from   table_name  where name in (sel

oracle去除重複資料常用的方法

建立測試資料 create table nayi224_180824(col_1 varchar2(10), col_2 varchar2(10), col_3 varchar2(10)); insert into nayi224_180824 select 1, 2, 3 fro

Oracle 刪除重複資料只留一條

查詢及刪除重複記錄的SQL語句 1、查詢表中多餘的重複記錄,重複記錄是根據單個欄位(Id)來判斷 select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1) 2、刪除

oracle 刪除重複資料 保留rowid 最小的行

舉個例子:     這要刪除 id 重複的行,只保留最小的 sql 語句就是: delete from table_name t1 where rowid not in(        select min(rowid

oracle重複資料並顯示出來

一。查詢重複記錄 1。查詢全部重複記錄 Select * From 表 Where 重複欄位 In (Select 重複欄位 From 表 Group By 重複欄位 Having Count(*)>1) 2。過濾重複記錄(只顯示一條) Select *

Oracle重複,作用於多列

1 用distinct關鍵字只能過濾查詢欄位中所有記錄相同的(記錄集相同),而如果要指定一個欄位卻沒有效果,另外distinct關鍵字會排序,效率很低 。 2 select distinct name from t1 能消除重複記錄,但只能取一個欄位,現在要同時取id,name這2個欄位的值。

R語言重複資料

本次總結來源網路,有多處參考 在R語言中,去掉重複資料的函式是:duplicated 刪掉所有列中資料一樣的: >test <- data.frame( x1 = c(1,2,

oracle 查詢重複資料並且刪除, 只保留一條資料的SQL語句

delete from t_account where feedate in (   select feedate           from t_account   group by feeda

oracle刪除重複資料,只留一條資料

--worked well。可以刪除重複記錄,對於多個欄位也是一樣的原理  delete from T_USER  where id in (select id from T_USER group b

大資料量高效率重複資料

前提: 表a 欄位 id、a1、a2(可以有多個欄位,在此為方便只列出3個欄位,其中id是主鍵,因此在一個表中是唯一的) 我的表資料大約是600w左右,最開始我採用的方法特別笨 delete from a where a.id not in(select max(id) f

oracle刪除重複資料並保留一條

1.刪除單個欄位,如下例子即為刪除學號相同的學生資料,即每個學號記錄一條學生資料 delete from stu t1 where t1.rowid not in ( select min(t2.rowid)

Oracle查詢重複資料並刪除,只保留一條記錄

前言專案中,在“資源目錄-線上編目”中,資源項子表存在多條重發資料,需要進行資料清理,刪除重發的資料,最終只保留一條相同的資料。操作的表名:R_RESOURCE_DETAILS操作步驟一、重複記錄根據單

oracle查詢重複資料方法

SQL重複記錄查詢方法 2008年08月14日 星期四 21:01 SQL重複記錄查詢 1、查詢表中多餘的重複記錄,重複記錄是根據單個欄位(peopleId)來判斷select * from people where peopleId in (select   peopl

Oracle過濾重複資料,取最新的資料

問題:在專案中有一張裝置檢測資訊表DEVICE_INFO_TBL, 每個裝置每天都會產生一條檢測資訊,現在需要從該表中檢索出每個裝置的最新檢測資訊。也就是device_id欄位不能重複,消除device_id欄位重複的記錄,而且device_id對應的檢測資訊t

ORACLE刪除重複資料的一種高效的方法

刪除重複資料的一種高效的方法 表demo是重複拷貝自dba_objects,有88萬左右,不重複的是27323,沒有索引 方法一:delete   from   demo   a   where   a.rowid   <>   (select   max(

oracle資料庫表中某幾個欄位的重複資料

delete from szpj_biz_水文觀測資料 a where (a.觀測點_id, a.觀測時間, a.取樣位置) in       (select 觀測點_id, 觀測時間, 取樣位置          from szpj_biz_水文觀測資料         g