




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、查找數據庫中重復數據T-SQL=第一篇= 在一張表中某個字段下面有重復記錄,有很多方法,但是有一個方法,是比較高 效的,如下語句:select data_guid from adam_entity_datas a where a.rowid (select min (b.rowid) from adam_entity_datas b where b.data_guid = a.data_guid) 如果表中有大量數據,但是重復數據比較少,那么可以用下面的語句提高效率 select data_guid from adam_entity_datas where data_guid in (sele
2、ct da ta_guid from adam_entity_datas group by data_guid having count(*) 1)此方法查詢出所有重復記錄了,也就是說,只要是重復的就選出來,下面的語句 也許更高效select data_guid from adam_entity_datas where rowid in (select rid fr om (select rowid rid,row_number()over(partition by data_guid order by rowid) m from adam_entity_datas) where m 1)目前
3、只知道這三種比較有效的方法。第一種方法比較好理解,但是最慢,第二種方法最快,但是選出來的記錄是所有 重復的記錄,而不是一個重復記錄的列表,第三種方法,我認為最好。=第二篇=select usercode,count(*) from ptype group by usercode h aving count(*) 1=第三篇=找出重復記錄的ID:select ID from(select ID ,count(*) as Cntfrom要消除重復的表group by ID) T1where Tt1 刪除數據庫中重復數據的幾個方法數據庫的使用過程中由于程序方面的問題有時候會碰到重復數據,重 復數據導
4、致了數據庫部分設置不能正確設置方法一declare max integer,id integerdeclare cur_rows cursor local for select 主字段,count(*) from表名 group by 主字段 having count(*) 1open cur_rowsfetch cur_rows into id,maxwhile fetch_status=0beginselect max = max -1set rowcount maxdelete from 表名 where 主字段=idfetch cur_rows into id,maxendclose
5、cur_rowsset rowcount 0方法二有兩個意義上的重復記錄,一是完全重復的記錄,也即所有字段均重復的記錄, 二是部分關鍵字段重復的記錄,比如Name字段重復,而其他字段不一定重復或 都重復可以忽略。1、對于第一種重復,比較容易解決,使用select distinct * from tableName就可以得到無重復記錄的結果集。如果該表需要刪除重復的記錄,可以按以下方法刪除select distinct * into #Tmp from tableNamedrop table tableNameselect * into tableName from #Tmpdrop table
6、 #Tmp2、這類重復問題通常要求保留重復記錄中的第一條記錄,*作方法如下假設有重復的字段為Name,Address,要求得到這兩個字段唯一的結果集select identity(int,1,1) as autolD, * into #Tmp fromtableNameselect min(autoID) as autoID into #Tmp2 from #Tmp group byName,autoIDselect * from #Tmp where autoID in(select autoID from#tmp2)最后一個select即得到了 Name,Address不重復的結果集更改數
7、據庫中表的所屬用戶的兩個方法大家可能會經常碰到一個數據庫備份還原到另外一臺機器結果導致所有的表都不能打開了,原因是建表的時候采用了當時的數據庫用戶=第四篇=如何查詢數據庫中的重復記錄?比如說有個表中的數據是這樣: aaab查詢出的結果是:記錄數量 TOC o 1-5 h z a3b2c1怎樣寫這個SQL語句?select distinct(name),count(*) from tabname group by name;想出來了,這樣就可以排序了。select a1,count(a1) as total from tablename group by a1 order by to tal d
8、esc select distinct(a1),count(a1) as total from tablename group by a1 ord er by total desc加個distinct更有效率 select p.*, m.* from table1 p left join table2 m on p.item1=m.item2 where p.item3=#$#%$ order by p.item3 asc limit 10就類似這么寫=第五篇=如何查找數據庫中的重復記錄?能在Access中用的方法 select *from 表 A inner join (select 字段
9、1,字段 2 from 表 group by 字段 1,字段2 having Count(*)1) B on A.字段 1=B.字段 1 and A.字段 2=B.字段 2問題: 根據其中幾個字段判斷重復,只保留一條記錄,但是要顯示全部字段,怎么查詢,謝謝!比如字段1字段2字段3字段4abc1abc1abd2abd3bbd2想得到的結果為2 (或者3)說明根據字段12,3組合不重復,字段4不考慮,得到了 3個記錄但是也要顯示字段4。方法一: 可以用臨時表的方法來解決:CurrentProject.Connection.Execute drop table temptableCurrentPro
10、ject.Connection.Execute select * into temptable from 表 2 where 1=2CurrentProject.Connection.Execute insert into temptable (字段 1,字段 2, 字段3) SELECT DISTINCT表2.字段1,表2.字段2,表2.字段3 FROM表2;CurrentProject.Connection.Execute UPDATE temptable INNER JOIN 表 2 ON (表 2.字段 1 = temptable.字段 1) AND (表 2.字段 2 = tempt
11、able.字段 2)AND (表 2.字段 3 = temptable.字段 3) SET temptable.字段 4 =表 2.字段4;方法二可以直接使用一個SELECT查詢篩選出需要的數據:可以假定第四字段都選值最小的SELECT 1,2, 3, Min(4) AS Min4FROM 表 1GROUP BY 表 1.1,表 1.2,表 1.3;問題:表2id NAME r1r211wee11112321212312312124341212312321123123ID為數值,NAME為字符。每條記錄沒有唯一標識。要求取得ID和NAME合并后不重復的記錄,如有重復保留其中一條即可,但要顯示所
12、有記錄。回答:SELECT a.*, (select top 1 r1 from 表 2 as al where al.id=a.id and 二) AS r1, (select top 1 r2 from 表 2 as a2 where a2.id=a.idand 二) AS r2FROM SELECT DISTINCT 表 2.id,表 2.NAMEFROM 表 2. AS a;SELECT a.*, dlookup(r1,表 2,id= & a.id & and name=& & )AS r1, dlookup(r2,表
13、2,id= & a.id & and name=& & )AS r2FROM SELECT DISTINCT 表 2.id,表 2.NAMEFROM 表 2. AS a;注意,上述代碼中由于沒有唯一標識列,因此顯示的R1 R2的先后次序無從確 定,一般是按輸入的先后順序,但是微軟沒有官方資料說明到底按哪個順序,請 網友注意。請注意,上述表2為沒有唯一標識字段,如果現在再建立一個自動編號字段“主 鍵”則可以用以下代碼SELECT a.ID, , b.rl, b.r2, b.主鍵FROM (SELECT 表 2.id,表 2.NAME, Min(表 2.主鍵)AS 主鍵F
14、ROM 表 2GROUP BY 表 2.id,表 2.NAME) AS a inner JOIN 表 2 AS b ON a.主鍵二b.主 鍵;=第六篇=1.查詢數據庫中重復的記錄:select realname,count(*) from users group by realname having count(*)1=第七篇=SELECT TO.ItemCode, TO.ItemName FROM OITM TO WHERE exists (select 1 f rom OITM A where A.CODEBARS = TO.CODEBARS And A.ItemCode TO.Item
15、C ode)=第八篇=相信很多人在查詢數據庫時都會碰到檢索某表中不重復記錄的時候,提到檢索不 重復記錄,馬上想到的肯定是Distinct或者Group By分組,小弟在初次使用的時候碰到了一些麻煩,這里拿出來與大家分享,希望對更多的 朋友有所幫助!先看看數據庫表結構:表名:TEST 字段:Id,A,B,C,D其中B字段包含重復值;IdA BC D111 abvb222 afgfg333 dht sdf444 a345 de555 csfsf sscv666 brt fg卜面我們來看看用什么樣的SQL語句檢索出不含重復記錄的數據:使用Distinct關鍵字Distinct關鍵字主要用來在SELE
16、CT查詢記錄中根據某指定字段的值去除重 復記錄SELECT DISTINCT 字段名FROM 表名WHERE 檢索條件字句所以用這樣一句SQL就可以去掉重復項了 :color=SELECT DISTINCT (B) FROM TEST但是:這里有一個非常非常需要注意的地方:SELECT DISTINCT 字段名后面不能再跟其他的字段,否則檢索出來的記錄 仍然會含有重復項;錯誤寫法:SELECT DISTINCT 字段名,其他字段名FROM 表名WHERE檢索條件字句實際上,我們上面SQL語句結果集里就只有B字段;(一般情況下,這種結果應 該是很難滿足需求的)如果我們的記錄集里還需要有其他字段值
17、,那怎么辦呢?實際上,我們完全可以用另一種辦法來解決問題;只是需要用到子查詢而已!使用GROUP BY分組有一點需要注意:使用帶有GROUP BY字句的查詢語句時,在SELECT列表指定的列要么是GROUP BY指定的列,要么包含聚合組函數所以用這樣一句SQL就可以去掉重復項了 :color=SELECT * FROM TEST WHERE id in (SELECT MIN(id) FROM TEST GROUP BY B)這樣就得到我們想要的結果集了 :IdA BC D111 a34 bvb333 dht sdf555 c sfsf sscv666 brt fg=第九篇=mysql=我的m
18、ysql表中的帳號是8位的隨機數,我現在想查帳號有沒有重復的,應該怎樣 操作,select count(*) as num,帳號 from TABLE GROUP BY 帳號num 1就有重復!=第十篇=二二二(著急的人直接看紅字)=在使用mysql時,有時需要查詢出某個字段不重復的記錄,雖然mysql提供有d istinct這個關鍵字來過濾掉多余的重復記錄只保留一條,但往往只用它來返回 不重復記錄的條數,而不是用它來返回不重記錄的所有值。其原因是distinct 只能返回它的目標字段,而無法返回其它字段,這個問題讓我困擾了很久,用d istinct不能解決的話,我只有用二重循環查詢來解決,而
19、這樣對于一個數據量 非常大的站來說,無疑是會直接影響到效率的。所以我花了很多時間來研究這個 問題,網上也查不到解決方案,期間把容容拉來幫忙,結果是我們兩人都郁悶 了。下面先來看看例子:tableid name TOC o 1-5 h z abccb庫結構大概這樣,這只是一個簡單的例子,實際情況會復雜得多。比如我想用一條語句查詢得到name不重復的所有數據,那就必須使用distinct 去掉多余的重復記錄。select distinct name from table得到的結果是:nameabc好像達到效果了,可是,我想要得到的是id值呢?改一下查詢語句吧: select distinct na
20、me, id from table結果會是:id name TOC o 1-5 h z abccb distinct怎么沒起作用?作用是起了的,不過他同時作用了兩個字段,也就是 必須得id與name都相同的才會被排除。我們再改改查詢語句: select id, distinct name from table很遺憾,除了錯誤信息你什么也得不到,distinct必須放在開頭。難到不能把d istinct放到where條件里?能,照樣報錯。很麻煩吧?確實,費盡心思都沒能解決這個問題。沒辦法,繼續找人問。拉住公司里一 JAVA程序員,他給我演示了 oracle里使用distinct之后,也沒 找到m
21、ysql里的解決方案,最后下班之前他建議我試試group by。試了半天,也不行,最后在mysql手冊里找到一個用法,用group_concat(dist inct name)配合group by name實現了我所需要的功能,興奮,天佑我也,趕快 試試。報錯。郁悶。連ysql手冊也跟我過不去, 先給了我希望,然后又把我推向失望,好狠哪。再仔細一查,group_concat函數是4.1支持,暈,我4.0的。沒辦法,升級,升完級一試,成功。終于搞定了,不過這樣一來,又必須要求客戶也升級了。突然靈機一閃,既然可以使用group_concat函數,那其它函數能行嗎?趕緊用count函數一試,成功,我
22、。想哭啊,費了這么多工夫。原來就這么簡單。現在將完整語句放出: select *, count(distinct name) from table group by name 結果:id name count(distinct name) TOC o 1-5 h z a 1b 1c 1最后一項是多余的,不用管就行了,目的達到。唉,原來mysql這么笨,輕輕一下就把他騙過去了,郁悶也就我吧(對了,還有 容容那家伙),現在拿出來希望大家不要被這問題折騰。哦,對,再順便說一句,group by必須放在order by和limit之前,不然會 報錯,差不多了,發給容容放網站上去,我繼續忙碌。更郁悶的事
23、情發生了,在準備提交時容容發現,有更簡單的解決方法。select id, name from table group by nameselect * from table group by name=第十一篇=查詢及刪除重復記錄的方法(一)1、查找表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷select * from peoplewhere peopleId in (select peopleId from people group by peopleId having count(peopleId) 1)2、刪除表中多余的重復記錄,重復記錄是根據單個字段(people
24、Id)來判斷,只留有rowid最小的記錄delete from peoplewhere peopleId in (select peopleId from people group by peopleId havi ng count(peopleId) 1)and rowid not in (select min(rowid) from people group by peopleld hav ing count(peopleId )1)3、查找表中多余的重復記錄(多個字段)select * from vitae awhere (a.peopleId,a.seq) in (select peo
25、pleId,seq from vitae group by peopleId,seq having count(*) 1)4、刪除表中多余的重復記錄(多個字段),只留有rowid最小的記錄delete from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) 1)and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)1)5
26、、查找表中多余的重復記錄(多個字段),不包含rowid最小的記錄select * from vitae awhere (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) 1)and rowid not in (select min(rowid) from vitae group by peopleId,seqhaving count(*)1)(二)比方說在A表中存在一個字段“name”,而且不同記錄之間的“name”值有可能會相同,現在就是需要查詢出在該表中的各記
27、錄之間,“name”值存在重復的項;Select Name,Count(*) From A Group By Name Having Count(*) 1如果還查性別也相同大則如下:Select Name,sex,Count(*) From A Group By Name,sex Having Count(*) 1(三)方法一declare max integer,id integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 gr oup by 主字段 having count(*) ;1open cur_rowsfetch cur_rows into id,m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流公司貨運管理制度
- 物流安全作業管理制度
- 物流應急車隊管理制度
- 物流貨場安全管理制度
- 物流部門合同管理制度
- 驅動作用下二維拓撲量子系統的理論研究
- miR-30a-5p對糖尿病種植體骨結合的影響及其機制研究
- 基于機器學習的土壤As(Ⅴ)吸附與污染風險預測研究
- 2025-2030年中國橡膠木行業市場深度調研及競爭格局與投資價值預測研究報告
- 2025-2030年中國無醛膠行業市場深度調研及發展趨勢與投資戰略研究報告
- 車間培訓課件教學課件
- 某化纖毛紡織廠全廠總配變電所及配電系統設計-課程設計論文
- 2024年大學試題(法學)-行政法與行政訴訟法考試近5年真題集錦(頻考類試題)帶答案
- 有限空間辨識記錄(辨識結果不是有限空間的)
- 醫院整體搬遷服務 投標方案(技術方案)
- 魚塘個人承包協議書范本
- GB/T 4706.8-2024家用和類似用途電器的安全第8部分:電熱毯、電熱墊、電熱衣及類似柔性發熱器具的特殊要求
- 正壓式空氣呼吸器使用培訓課件
- 08S305 小型潛水排污泵選用及安裝
- 初中自薦信范文
- 血培養采集課件
評論
0/150
提交評論