資料庫去掉重復資料庫
示例
假設存在一個產品信息表Procts,其表結構如下:
CREATETABLEProcts(
ProctIDint,
ProctNamenvarchar(40),
Unitchar(2),
UnitPricemoney
)
表中數據如圖:
*fromProcts_tempdroptableProcts_temp
這樣就完成了對表中重復記錄的刪除。無論表有多大,它的執行速度都是相當快的,而且因為幾乎不用寫語句,所以它也是很安全的
② Oracle資料庫重復數據刪除的幾種方法
重復的數據可能有這樣兩種情況,第一種時表中只有某些欄位一樣,第二種是兩行記錄完全一樣。Oracle資料庫重復數據刪除技術有如下優勢:更大的備份容量、數據能得到持續驗證、有更高的數據恢復服務水平、方便實現備份數據的容災。
一、刪除部分欄位重復數據先來談談如何查詢重復的數據吧。
下面語句可以查詢出那些數據是重復的:
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
臨時表);
這種先建臨時表再進行刪除的操作要比直接用一條語句進行刪除要高效得多。
這個時候,大家可能會跳出來說,什麼?你叫我
③ Mysql去掉重復數據的做法:distinct , group by。以及資料庫的拓展
一張user表 中的name欄位,裡面有10個張三。我要只查詢出一個張三。
SQL: select distinct name from user
如果還要查詢出id
SQL: select distinct name,id from user
SQL :select name from user group by name
group by理解:表裡的某一個欄位(比如:name) 當出現相同的數據時,group by就將這2條數據合二為一。name就顯示一條 數據了。 但是name達到合二為一了,這2條數據的其他數據怎麼辦呢? 這時候需要配合聚合函數的使用。
where條件:分組前的條件,配合任何關鍵字使用
Having 條件:分組後的條件 (事後條件) ,只配合group by使用。having條件通常使用聚合函數
SQL :select deptno,sum(sal) from emp group by deptno having sum(sal) > 9000;
SQL: select deptno,count(*) from emp where sal >1000 group by deptno haing sum(sal) > 8000
拓展:
聚合函數定義:聚合函數對一組值進行計算並返回單一的值。(以下都屬於聚合函數)
count(*) : 不包括空值。返回對行數目的計數。計算出有多少行,多少條數據。
count() : 包含空值。返回對數目的計數。計算表裡有多少行,相當於多少條數據。
sum() : 求和運算
max(); 最大值
min(): 最小值
avg(): 平均值
④ 教你刪除Oracle資料庫中重復沒用的數據
在對資料庫進行操作過程中我們可能會碰到這種情況 表中的數據可能重復出現 使我們對資料庫的操作過程中帶來很多的不便 那麼怎麼刪除這些重復沒有用的數據呢?
重復數據刪除技術可以提供更大的備份容量 實現更長時間的數據保留 還能實現備份數據的持續驗證 進步數據恢復服務水平 方便實現數據容災等 重復的數據可能有這樣兩種情況 第一種時表中只有某些欄位一樣 第二種是兩行記錄完全一樣 Oracle資料庫重復數據刪除技術有如下優勢 更大的備份容量 數據能得到持續驗證 有更高的數據恢復服務水平 方便實現備份數據的容災
一 刪除部分欄位重復數據
先來談談如何查詢重復的數據吧
下面語句可以查詢出那些數據是重復的
select 欄位 欄位 count(*) from 表名 group by 欄位 欄位 having count(*) >
將上面的>號改為=號就可以查詢出沒有重復的數據了
想要刪除這些重復的數據 可以使用下面語句進行刪除
delete from 表名 a where 欄位 欄位 in
(select 欄位 欄位 count(*) from 表名 group by 欄位 欄位 having count(*) > )
上面的語句非常簡單 就是將查詢到的數據刪除掉 不過這種刪除執行的效率非常低 對於大數據量來說 可能會將資料庫弔死 所以我建議先將查詢到的重復的數據插入到一個暫時表中 然後對進行刪除 這樣 執行刪除的時候就不用再進行一次查詢了 如下
create TABLE 暫時表 AS
(select 欄位 欄位 count(*) from 表名 group by 欄位 欄位 having count(*) > )
上面這句話就是建立了暫時表 並將查詢到的數據插入其中
下面就可以進行這樣的刪除操作了
delete from 表名 a where 欄位 欄位 in (select 欄位 欄位 from 暫時表);
這種先建暫時表再進行刪除的操作要比直接用一條語句進行刪除要高效得多
這個時候 大家可能會跳出來說 什麼?你叫我們執行這種語句 那不是把所有重復的全都刪除嗎?而我們想保留重復數據中最新的一條記錄啊!大家不要急 下面我就講一下如何進行這種操作
在oracle中 有個隱藏了自動rowid 裡面給每條記錄一個唯一的rowid 我們假如想保留最新的一條記錄
我們就可以利用這個欄位 保留重復數據中rowid最大的一條記錄就可以了
下面是查詢重復數據的一個例子
以下是引用片段 selecta rowid a *from表名awherea rowid!=(selectmax(b rowid)from表名bwherea 欄位 =b 欄位 anda 欄位 =b 欄位 )
下面我就來講解一下 上面括弧中的語句是查詢出重復數據中rowid最大的一條記錄
而外面就是查詢出除了rowid最大之外的其他重復的數據了
由此 我們要刪除重復數據 只保留最新的一條數據 就可以這樣寫了
deletefrom表名awherea rowid!=(selectmax(b rowid)from表名bwherea 欄位 =b 欄位 anda 欄位 =b 欄位 )
隨便說一下 上面語句的執行效率是很低的 可以考慮建立暫時表 講需要判定重復的欄位 rowid插入暫時表中 然後刪除的時候在進行比較
createtable暫時表asselecta 欄位 a 欄位 MAX(a ROWID)dataidfrom正式表aGROUPBYa 欄位 a 欄位 ;deletefrom表名awherea rowid!=(selectb dataidfrom暫時表bwherea 欄位 =b 欄位 anda 欄位 =b 欄位 );mit;
二 完全刪除重復記錄
對於表中兩行記錄完全一樣的情況 可以用下面語句獲取到去掉重復數據後的記錄
select distinct * from 表名
可以將查詢的記錄放到暫時表中 然後再將原來的表記錄刪除 最初將暫時表的數據導回原來的表中 如下
createTABLE暫時表AS(selectdistinct*from表名);truncatetable正式表; 注 原先由於筆誤寫成了droptable正式表; 現在已經改正過來insertinto正式表(select*from暫時表);droptable暫時表;
假如想刪除一個表的重復數據 可以先建一個暫時表 將去掉重復數據後的數據導入到暫時表 然後在從暫時表將數據導入正式表中 如下
insertINTOt_table_bakselectdistinct*fromt_table;
三 怎樣快速刪除oracle資料庫
最快的方法就進入注冊表 在運行 里輸入regedit
依次展開HKEY_LOCAL_MACHINE SOFARE
找到ORACLE節點 刪除
然後刪除ORACLE數據文件 安裝的時候選的路徑
lishixin/Article/program/Oracle/201311/18677
⑤ mysql資料庫刪除重復數據
直接拿1樓的來改吧,
delete from zhszty_ebook
where id not in(
select * from (select max(id) from zhszty_ebook group by url
) as tmp);------------mysql有個特性,對於表進行修改,刪除操作,子查詢不能和外層的查詢的表一樣,所以在加個select就可以了。其他資料庫按照樓上的那個是沒問題的
⑥ 如何刪除資料庫中的重復數據
有兩個意義上的重復記錄
①完全重復的記錄,也即所有欄位均重復的記錄。
②部分關鍵欄位重復的記錄,比如Name欄位重復,而其他欄位不一定重復或都重復可以忽略。
1、對於第一種重復,比較容易解決,使用
selectdistinct*fromtableName
這樣就可以得到無重復記錄的結果集。然後通過臨時表實現對數據的維護。
selectdistinct*into#TmpfromtableName
droptabletableName
select*intotableNamefrom#Tmp
droptable#Tmp
#Tmp為什麼系統參數,tableName為要操作的表名。
2、第二類重復問題通常要求保留重復記錄中的第一條記錄,操作方法如下:
假設有重復的欄位為Name,Address,要求得到這兩個欄位唯一的結果集
selectidentity(int,1,1)asautoID,*into#TmpfromtableName
selectmin(autoID)asautoIDinto#Tmp2from#TmpgroupbyName,autoID
select*from#TmpwhereautoIDin(selectautoIDfrom#tmp2)
最後一個select即得到了Name,Address不重復的結果集(但多了一個autoID欄位,實際寫時可以寫在select子句中省去此列)
⑦ 如何查找和刪除資料庫中的重復數據
法一:
用Group
by語句
此查找很快的select
count(num),
max(name)
from
student
–查找表中num列重復的,列出重復的記錄數,並列出他的name屬性group
by
numhaving
count(num)
>;1
–按num分組後找出表中num列重復,即出現次數大於一次delete
from
student(上面Select的)這樣的話就把所有重復的都刪除了。—–慎重法二:當表比較大(例如10萬條以上)時,這個方法的效率之差令人無法忍受,需要另想辦法:—-
執行下面SQL語句後就可以顯示所有DRAWING和DSNO相同且重復的記錄SELECT
*
FROM
EM5_PIPE_PREFABWHERE
ROWID!=(SELECT
MAX(ROWID)
FROM
EM5_PIPE_PREFAB
D
–D相當於First,SecondWHERE
EM5_PIPE_PREFAB.DRAWING=D.DRAWING
ANDEM5_PIPE_PREFAB.DSNO=D.DSNO);—-
執行下面SQL語句後就可以刪除所有DRAWING和DSNO相同且重復的記錄DELETE
FROM
EM5_PIPE_PREFABWHERE
ROWID!=(SELECT
MAX(ROWID)
FROM
EM5_PIPE_PREFAB
DWHERE
EM5_PIPE_PREFAB.DRAWING=D.DRAWING
ANDEM5_PIPE_PREFAB.DSNO=D.DSNO);法一:
用Group
by語句
此查找很快的select
count(num),
max(name)
from
student
–查找表中num列重復的,列出重復的記錄數,並列出他的name屬性group
by
numhaving
count(num)
>;1
–按num分組後找出表中num列重復,即出現次數大於一次delete
from
student(上面Select的)這樣的話就把所有重復的都刪除了。—–慎重法二:當表比較大(例如10萬條以上)時,這個方法的效率之差令人無法忍受,需要另想辦法:—-
執行下面SQL語句後就可以顯示所有DRAWING和DSNO相同且重復的記錄SELECT
*
FROM
EM5_PIPE_PREFABWHERE
ROWID!=(SELECT
MAX(ROWID)
FROM
EM5_PIPE_PREFAB
D
–D相當於First,SecondWHERE
EM5_PIPE_PREFAB.DRAWING=D.DRAWING
ANDEM5_PIPE_PREFAB.DSNO=D.DSNO);—-
執行下面SQL語句後就可以刪除所有DRAWING和DSNO相同且重復的記錄DELETE
FROM
EM5_PIPE_PREFABWHERE
ROWID!=(SELECT
MAX(ROWID)
FROM
EM5_PIPE_PREFAB
DWHERE
EM5_PIPE_PREFAB.DRAWING=D.DRAWING
ANDEM5_PIPE_PREFAB.DSNO=D.DSNO);
⑧ 如何查找和刪除資料庫中的重復數據
如何查找和刪除資料庫中的重復數據
以Excel2010版本為例,可以直接使用數據→刪除重復項的功能來實現刪除重復數據。
此功能Excel2007及以上版本均可,WPS中也有這樣的功能。另外還可以使用公式法去重復,常用的函數是Countif函數。
⑨ sql中如何刪除一個表中重復的記錄
sql中刪除一個表中的重復記錄可以採用如下步驟:
1、把a_dist表的記錄用distinct去重,結果放到臨時表中。
select distinct * into #temp from a_dist;
2、把a_dist表的記錄全部刪除。
delete from a_dist;
3、把臨時表中的數據信息導進到a_dist表中,並刪除臨時表。
insert into a_distselect * from #temp;
drop table #temp;
(9)資料庫去掉重復資料庫擴展閱讀:
SQL (結構化查詢語言)是用於執行查詢的語法。在資料庫上執行的大部分工作都由 SQL 語句完成。SQL 語言包含用於更新、插入和刪除記錄的語法。
增刪改查指令構成了 SQL 的 DML 部分:
SELECT- 從資料庫表中獲取數據
UPDATE- 更新資料庫表中的數據
DELETE- 從資料庫表中刪除數據
INSERT INTO- 向資料庫表中插入數據
⑩ 刪除資料庫中重復數據的幾個方法
方法一
declare @max integer,@id integer
declare cur_rows cursor local for select 主欄位,count(*) from 表名 group by 主欄位 having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where 主欄位 = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0
方法二
有兩個意義上的重復記錄,一是完全重復的記錄,也即所有欄位均重復的記錄,二是部分關鍵欄位重復的記錄,比如Name欄位重復,而其他欄位不一定重復或都重復可以忽略。
1、對於第一種重復,比較容易解決,使用 select distinct * from tableName 就可以得到無重復記錄的結果集。
如果該表需要刪除重復的記錄(重復記錄保留1條),可以按以下方法刪除
select distinct * into #Tmp from tableName
drop table tableName
select * into tableName from #Tmp
drop table #Tmp
發生這種重復的原因是表設計不周產生的,增加唯一索引列即可解決。
2、這類重復問題通常要求保留重復記錄中的第一條記錄,操作方法如下:
假設有重復的欄位為Name,Address,要求得到這兩個欄位唯一的結果集
select identity(int,1,1) as autoID, * into #Tmp from tableName
select min(autoID) as autoID into #Tmp2 from #Tmp group by Name,autoID
select * from #Tmp where autoID in(select autoID from #tmp2)
最後一個select即得到了Name,Address不重復的結果集(但多了一個autoID欄位,實際寫時可以寫在select子句中省去此列)