1. 程式人生 > >oracle中去重複記錄 不用distinct

oracle中去重複記錄 不用distinct

用distinct關鍵字只能過濾查詢欄位中所有記錄相同的(記錄集相同),而如果要指定一個欄位卻沒有效果,另外distinct關鍵字會排序,效率很低 。

select distinct name from t1 能消除重複記錄,但只能取一個欄位,現在要同時取id,name這2個欄位的值。

select distinct id,name from t1 可以取多個欄位,但只能消除這2個欄位值全部相同的記錄

所以用distinct達不到想要的效果,用group by   可以解決這個問題。

例如要顯示的欄位為A、B、C三個,而A欄位的內容不能重複可以用下面的語句:

select A, min(B),min(C),count(*) from [table] where [條件] group by   A

having [條件] order by A desc

為了顯示標題頭好看點可以把select A, min(B),min(C),count(*) 換稱select A as A, min(B) as B,min(C) as C,count(*) as 重複次數

顯示出來的欄位和排序欄位都要包括在group by 中

但顯示出來的欄位包有min,max,count,avg,sum等聚合函式時可以不在group by 中

如上句的min(B),min(C),count(*)

一般條件寫在where 後面

有聚合函式的條件寫在having 後面

如果在上句中having加 count(*)>1   就可以查出記錄A的重複次數大於1的記錄

如果在上句中having加 count(*)>2   就可以查出記錄A的重複次數大於2的記錄

如果在上句中having加 count(*)>=1   就可以查出所有的記錄,但重複的只顯示一條,並且後面有顯示重複的次數----這就是所需要的結果,而且語句可以通過hibernate

下面語句可以查詢出那些資料是重複的:

   select 欄位1,欄位2,count(*) from 表名 group by 欄位1,欄位2 having count(*) > 1

         將上面的>號改為=號就可以查詢出沒有重複的資料了。

例如 select count(*) from (select gcmc,gkrq,count(*) from gczbxx_zhao t group by gcmc,gkrq having

count(*)>=1 order by GKRQ)

select * from gczbxx_zhao where viewid in ( select max(viewid) from gczbxx_zhao group by

gcmc ) order by gkrq desc ---還是這個可行。

有一面試題說:distinct去重複的效率很底下,我在網上看到這遍文章的方法好像說是用 group by   having  效率很高了?

我在了一個測試,有一商品表,26萬條記錄,只有商品編號建了索引,對品牌名稱欄位做 distinct

select brand,count(*) from tab_commbaseinfo  group by brand having count(*) =1

平均時間是:0.453

select distinct brand from tab_commbaseinfo 

平均時間是:0.39

搞不懂是否還有其它方法。


相關推薦

oracle重複記錄 不用distinct

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

oracle怎樣排除重複記錄--通過distinct來實現

distinct這個關鍵字來過濾掉多餘的重複記錄只保留一條,但往往只用 它來返回不重複記錄的條數,而不是用它來返回不重記錄的所有值。其原因是distinct只有用二重迴圈查詢來解決,而這樣對於一個數據量非常大的站來說,無疑是會直接影響到效率的。 下面先來看看例子: tabl

Oracle 查看錶重複記錄,以及去除表重複記錄

--查看錶中重複的記錄   select       tscw.L_SEC_KEY as L_BOND_KEY ,---債券內碼      to_date(twcb.b_info_carrydate,'yyyyMMdd') as D_BEGIN,--計息起始日      

mysql刪除重複記錄,並保留重複資料的一條資料的SQL語句理解

正好想寫一條刪除重複語句並保留一條資料的SQL,網上查了一部分資料寫的很詳細,但還是在這裡寫下自己的理解,以遍後續學習 。如下: 表字段和資料:  SQL語句:  DELETE FROM `user` WHERE id NOT IN(SELECT * FROM(

mysql 資料表查詢重複記錄

1、單個欄位 查詢所有重複資料 select * from ActivityWinUser where (UID) in(select UID from ActivityWinUser group by UID having count(*)>1); 去重 delete from table w

mysql去除重複資料之distinct用法

最近利用郭神的litepal建立了郵件客戶端的前端資料庫,然後實現最近聯絡人的顯示,需要在資料庫裡去查詢傳送人的暱稱和傳送人的地址兩個欄位,但發現litepal不支援distinct查詢,但可以通過原生的sql語句實現: select distinct fromaddress,fromname

java-ArrayList重複字串或重複物件、LinkedList集合、泛型、增強for、靜態匯入、可變引數、asList()方法、集合巢狀

1、去除ArrayList中重複字串元素方式  * A:案例演示     * 需求:ArrayList去除集合中字串的重複值(字串的內容相同)     * 思路:建立新集合方式     /**     * A:案例演示     * 需求:ArrayList去除集合中字串的重複值(字串的內容相同)     

ORACLE查詢刪除重複記錄三種方法

比如現在有一人員表 (表名:peosons) 若想將姓名、身份證號、住址這三個欄位完全相同的記錄查詢出來  複製程式碼程式碼如下: select p1.*    from persons  p1,persons  p2    where p1.id<>p

刪除表重複記錄

5、查詢表中多餘的重複記錄(多個欄位),不包含rowid最小的記錄 select * from vitae a where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*)

Oracle 快速刪除重複記錄

1. delete  from DJ_SKSKJ where rowid in (select max(rowid)                   from DJ_SKSKJ                  where jddm = '01'             

只使用一條sql語句,刪除表重複記錄

一個表,表1,ref(唯一值),type(有重複)如何去掉重複記錄。 建表sql語句: -- ---------------------------- -- Table structure for `deletechongfu` -- -------------------

刪除SQL2000資料表重複記錄

有兩個意義上的重複記錄,一是完全重複的記錄,也即所有欄位均重複的記錄,二是部分關鍵欄位重複的記錄,比如Name欄位重複,而其他欄位不一定重複或都重複可以忽略。 1、對於第一種重複,比較容易解決,使用 select distinct * from tableName 就可以得到

Oracle 去除重複資料

在網上查了一下,去除重複資料有兩種情況: 1、部分欄位重複,對於這種情況可這樣做: (1)create table 臨時表 as select a.欄位1,a.欄位2,MAX(a.ROWID) dataid from 正式表 a GROUP BY a.欄位1,a.欄位2;

db2刪除重複記錄的sql語句

1、查詢表中多餘的重複記錄,重複記錄是根據單個欄位(peopleId)來判斷 select * from people where peopleId in (select peopleId from people group by peopleId having coun

如何刪除表重複記錄

<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script><script type="text/

聯合主鍵 重複記錄的方法

方法1、 就是將三個欄位連線起來作為主鍵,進行資料是否重複的判斷。這裡值得注意的是某列的值可能為空,所以要賦一個空字串過去: select * from t1 where nvl(col1,'')|| nvl(col2,'')|| col3 not in (select col1||col2||col3 fr

jquery重複排序(函式: $.grep() join() sort() )

var str = '12345678543'; var array = str.split ("");//分割為陣列 console.log (array); //去除陣列中重

Oracle的多記錄新增和mysql不同

在MySQL中我們用的是insert into security_role_org_resource values(1201,82001), (1201, 82001)而同樣的語句中放到Oracle中確實錯的,但可以使用這樣的語句插入多條insert all into sec

JS(ES6)去除陣列重複記錄

1.雙層迴圈,外層迴圈元素,內層迴圈時比較值;如果有相同的值則跳過,不相同則push進陣列 // formatConcatArr(array)==[ 1, 23, 2, 3 ]  formatConcatArr(array)=={{formatConcatArr([1,

關於mysql刪除重複記錄,並保留重複資料的一條資料的SQL語句理解

正好想寫一條刪除重複語句並保留一條資料的SQL,網上查了一部分資料寫的很詳細,但還是在這裡寫下自己的理解,以遍後續學習 。如下: 表字段和資料:  SQL語句:  DELETE FROM `user` WHERE id NOT IN(SELECT * FROM(SELE