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

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

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

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

    sql 單表/多表查詢去除重復記錄

    單表distinct

    多表group by

    group by 必須放在 order by 和 limit之前,不然會報錯

    ************************************************************************************

    1、查找表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷

    select * from people
    where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

    2、刪除表中多余的重復記錄,重復記錄是根據單個字段(peopleId)來判斷,只留有rowid最小的記錄
    delete from people
    where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)
    and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)

    3、查找表中多余的重復記錄(多個字段)
    select * from vitae a
    where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)

    4、刪除表中多余的重復記錄(多個字段),只留有rowid最小的記錄
    delete from vitae a
    where (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、查找表中多余的重復記錄(多個字段),不包含rowid最小的記錄
    select * from vitae a
    where (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)

    (二)
    比方說
    在A表中存在一個字段“name”,
    而且不同記錄之間的“name”值有可能會相同,
    現在就是需要查詢出在該表中的各記錄之間,“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 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子句中省去此列)

    (四)
    查詢重復

    select * from tablename where id in (select id from tablename

    group by id

    having count(id) > 1

    )

    3、查找表中多余的重復記錄(多個字段)
    select * from vitae a
    where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

    運行會產生問題,where(a.peopleId,a.seq)這樣的寫發是通不過的!!!

    posted on 2012-11-21 23:20 abin 閱讀(550) 評論(0)  編輯  收藏 所屬分類: Database
    主站蜘蛛池模板: 十八禁在线观看视频播放免费| 亚洲综合一区无码精品| 一级毛片人与动免费观看| 四虎影视精品永久免费网站| 久久精品国产亚洲AV忘忧草18| 18禁美女裸体免费网站| 亚洲综合视频在线观看| 国产精品成人观看视频免费| 亚洲综合男人的天堂色婷婷| 亚洲无砖砖区免费| 亚洲国产精品日韩在线| 91成人免费观看网站| 亚洲天堂2016| 青青草国产免费久久久下载| 亚洲精品成a人在线观看夫| 国产午夜免费秋霞影院| 四虎影视在线看免费观看| 久久亚洲AV永久无码精品| 日韩电影免费在线观看网站| 亚洲午夜久久影院| 99久久免费精品国产72精品九九 | 久久久www成人免费毛片| 国产成人精品日本亚洲专| 日本一线a视频免费观看| 特级一级毛片免费看| 亚洲午夜福利717| 最近高清中文字幕免费| 国产成人亚洲综合一区| yy6080久久亚洲精品| 少妇性饥渴无码A区免费 | 思思久久99热免费精品6| 国产亚洲精久久久久久无码77777| 久久免费公开视频| 亚洲成av人片天堂网无码】| 亚洲黄黄黄网站在线观看| 国产免费一区二区三区不卡| 亚洲男人的天堂在线| 亚洲第一黄片大全| 亚洲免费视频网址| 免费人人潮人人爽一区二区| 亚洲天堂中文字幕|