<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    The important thing in life is to have a great aim , and the determination

    常用鏈接

    統計

    IT技術鏈接

    保險相關

    友情鏈接

    基金知識

    生活相關

    最新評論

    如何查找、刪除表中重復的記錄

    軟件環境:

    1Windows NT4.0+ORACLE 8.0.4

    2ORACLE安裝路徑為:C:"ORANT

    問題提出:

    1、當我們想要為一個表創建唯一索引時,如果該表有重復的記錄,則無法創建成功。

    方法原理:

    1Oracle中,每一條記錄都有一個rowidrowid在整個數據庫中是唯一的,

      rowid確定了每條記錄是在ORACLE中的哪一個數據文件、塊、行上。

    2、在重復的記錄中,可能所有列的內容都相同,但rowid不會相同,所以只要確定出重復記錄中

      那些具有最大rowid的就可以了,其余全部刪除。

    3、以下語句用到了3項技巧:rowid、子查詢、別名。

    實現方法:

    SQL> create table a (

     2 bm char(4),            --編碼

     3 mc varchar2(20)            --名稱

     4 )

     5 /

    表已建立.

    SQL> insert into a values('1111','1111');

    SQL> insert into a values('1112','1111');

    SQL> insert into a values('1113','1111');

    SQL> insert into a values('1114','1111');

    SQL> insert into a select * from a;

    插入4個記錄.

    SQL> commit;

    完全提交.

    SQL> select rowid,bm,mc from a;

    ROWID              BM   MC

    ------------------ ---- -------

    000000D5.0000.0002 1111 1111

    000000D5.0001.0002 1112 1111

    000000D5.0002.0002 1113 1111

    000000D5.0003.0002 1114 1111

    000000D5.0004.0002 1111 1111

    000000D5.0005.0002 1112 1111

    000000D5.0006.0002 1113 1111

    000000D5.0007.0002 1114 1111

     

    查詢到8記錄.

    查出重復記錄

    SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

    ROWID              BM   MC

    ------------------ ---- --------------------

    000000D5.0000.0002 1111 1111

    000000D5.0001.0002 1112 1111

    000000D5.0002.0002 1113 1111

    000000D5.0003.0002 1114 1111

     

    刪除重復記錄

    SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

    刪除4個記錄.

    SQL> select rowid,bm,mc from a;

    ROWID              BM   MC

    ------------------ ---- --------------------

    000000D5.0004.0002 1111 1111

    000000D5.0005.0002 1112 1111

    000000D5.0006.0002 1113 1111

    000000D5.0007.0002 1114 1111

     

    come from :: http://dev.csdn.net/article/59/59333.shtm

    -測試數據

    /*-----------------------------

    select * from tt

    -----------------------------*/

    id          pid        

    ----------- -----------

    1           1

    1           1

    2           2

    3           3

    3           3

    3           3

    (所影響的行數為 6 行)

    首先,如何查詢table中有重復記錄

    select *,count(1) as rownum

    from tt

    group by id, pid

    having count(1) > 1

    id          pid         rownum     

    ----------- ----------- -----------

    1           1           2

    3           3           3

     

    (所影響的行數為 2 行)

    方法一:使用distinct和臨時表

    if object_id('tempdb..#tmp') is not null

    drop table #tmp

    select distinct * into #tmp from tt

    truncate table tt

    insert into tt select * from #tmp

    方法二:添加標識列

    alter table tt add NewID int identity(1,1)

    go 

    delete from tt where exists(select 1 from tt a where a.newid>tt.newid and tt.id=a.id and tt.pid=a.pid)

    go

    alter table tt drop column NewID

    go

    --測試結果

    /*-----------------------------

    select * from tt

    -----------------------------*/

    id          pid        

    ----------- -----------

    1           1

    2           2

    3           3

    (所影響的行數為 3 行)

    *---*-- * 8 8 * * * * 8* * * * 8 8 *

    USE CEO

    CREATE TABLE TT

    (

    TTNO CHAR(4),

    TTNAME VARCHAR(10)

    )

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1425','WHERE')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1425','WHERE')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1424','WHEREIS')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1435','WHEREIS')

    INSERT INTO TT (TTNO,TTNAME) VALUES ('1435','WHEREIS')

    方法二:添加標識列(最有效方法)

    alter table tt add newid2 int identity(1,1)

    go

    delete from tt where exists( select 1 from tt   a where a.newid2>tt.newid2 and tt.ttno=a.ttno and tt.ttname=a.ttname)

    alter table tt drop column newid2

    go

    select * from tt

    posted on 2008-01-22 01:57 鴻雁 閱讀(293) 評論(0)  編輯  收藏 所屬分類: IT技術相關

    主站蜘蛛池模板: 亚洲国产欧美国产综合一区 | 精品久久久久久久久免费影院| 国产亚洲精品福利在线无卡一| 一级黄色片免费观看| 亚洲精品视频免费| 亚洲免费在线观看| 亚洲韩国精品无码一区二区三区| 久久性生大片免费观看性| 亚洲人成亚洲人成在线观看| 精品国产免费人成网站| 亚洲精品自在在线观看| 国产一区二区免费视频| 亚洲黑人嫩小videos| 成人性生交大片免费看无遮挡| 亚洲最大的成人网| 亚洲精品成a人在线观看| 国产成人1024精品免费| 亚洲不卡av不卡一区二区| 最近免费最新高清中文字幕韩国| 亚洲中文字幕无码av在线| 国产h视频在线观看免费| 亚洲aⅴ无码专区在线观看| 亚洲伊人久久综合影院| 久久精品国产这里是免费| 亚洲一区二区三区免费视频| 国产一级高清视频免费看| 精品久久久久久国产免费了| 久久精品国产精品亚洲蜜月| 黄色成人免费网站| 婷婷国产偷v国产偷v亚洲| 亚洲av永久无码精品漫画| 国产成人精品久久免费动漫| 日韩色视频一区二区三区亚洲| 亚洲综合色区在线观看| 久久国产免费一区| 欧美日韩亚洲精品| 亚洲AV第一页国产精品| 日韩免费观看的一级毛片| a国产成人免费视频| 亚洲伦理中文字幕| 亚洲午夜福利717|