當(dāng)前訪問本站: hits

          yjhmily

          堅(jiān)持走自己的路……

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            100 Posts :: 8 Stories :: 353 Comments :: 0 Trackbacks
          ??? 相信很多人在查詢數(shù)據(jù)庫時(shí)都會(huì)碰到檢索某表中不重復(fù)記錄的時(shí)候,提到檢索不重復(fù)記錄,馬上想到的肯定是Distinct或者Group By分組,
          小弟在初次使用的時(shí)候碰到了一些麻煩,這里拿出來與大家分享,希望對更多的朋友有所幫助!

          ??? 先看看數(shù)據(jù)庫表結(jié)構(gòu):
          ??? ??? 表名: TEST? 字段: Id,A,B,C,D
          ??? ??? 其中B字段包含重復(fù)值;

          Id

          A

          B

          C

          D

          1

          11

          a

          34

          bvb

          2

          22

          a

          35

          fgfg

          3

          33

          d

          ht

          sdf

          4

          44

          a

          345

          de

          5

          55

          c

          sfsf

          sscv

          6

          66

          b

          rt

          fg


          ???
          ??





          ?



          ???

          下面我們來看看用什么樣的SQL語句檢索出不含重復(fù)記錄的數(shù)據(jù):
          ?使用Distinct關(guān)鍵字
          ??? ? Distinct關(guān)鍵字主要用來在SELECT查詢記錄中根據(jù)某指定字段的值去除重復(fù)記錄
          ??? ?SELECT DISTINCT [字段名] FROM [表名] WHERE [檢索條件字句]

          ??? 所以用這樣一句SQL就可以去掉重復(fù)項(xiàng)了:
          ??? ?? ?
          SELECT?DISTINCT?(B)?FROM?TEST

          ??? 但是:

          ??? ? 這里有一個(gè)非常非常需要注意的地方:
          ??? ? SELECT DISTINCT [字段名]后面不能再跟其他的字段,否則檢索出來的記錄仍然會(huì)含有重復(fù)項(xiàng);
          ????? 錯(cuò)誤寫法:
          ??? ??? ??? SELECT DISTINCT [字段名] ,[其他字段名] FROM [表名] WHERE [檢索條件字句]
          ???
          ??? 實(shí)際上,我們上面SQL語句結(jié)果集里就只有B字段;(一般情況下,這種結(jié)果應(yīng)該是很難滿足需求的)


          ??? 如果我們的記錄集里還需要有其他字段值,那怎么辦呢?

          實(shí)際上,我們完全可以用另一種辦法來解決問題;只是需要用到子查詢而已!

          使用GROUP BY 分組
          ??? 有一點(diǎn)需要注意:
          ??? ?? 使用帶有GROUP BY字句的查詢語句時(shí),在SELECT列表指定的列要么是GROUP BY 指定的列,要么包含聚合組函數(shù)

          ??? 所以用這樣一句SQL就可以去掉重復(fù)項(xiàng)了:

          SELECT?*?FROM?TEST?WHERE?id?in?(SELECT?MIN(id)?FROM?TEST?GROUP?BY?B)

          ??? 這樣就得到我們想要的結(jié)果集了:
          ???

          Id

          A

          B

          C

          D

          1

          11

          a

          34

          bvb

          3

          33

          d

          ht

          sdf

          5

          55

          c

          sfsf

          sscv

          6

          66

          b

          rt

          fg


          ??? ??

          ??? ??





          posted on 2006-12-15 11:24 kangxm 閱讀(1714) 評論(1)  編輯  收藏 所屬分類: SQL

          Feedback

          # re: 檢索數(shù)據(jù)庫表中的不重復(fù)記錄 2007-10-31 18:37 葉子
          'SELECT * FROM TEST WHERE id in (SELECT MIN(id) FROM TEST GROUP BY B)'

          用in 查詢將不會(huì)使用索引,效率會(huì)降低,如果是100W級的數(shù)據(jù),建議把MIN(id)抽到臨時(shí)表,在join 就搞定了.

          當(dāng)你遇到這種情況的時(shí)候需要把 重復(fù)的刪除掉 怎么辦?
          要腳本的來找我.  回復(fù)  更多評論
            


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 孟村| 商洛市| 揭西县| 邵阳县| 宁乡县| 达日县| 沛县| 昌宁县| 怀安县| 民县| 防城港市| 朝阳市| 依兰县| 紫金县| 晴隆县| 南开区| 镇江市| 本溪| 璧山县| 福州市| 治多县| 台东县| 惠东县| 鹤峰县| 新巴尔虎左旗| 宾川县| 平和县| 会理县| 绥化市| 宁南县| 石林| 通州市| 新化县| 靖边县| 灵丘县| 如东县| 祁门县| 苍溪县| 安龙县| 儋州市| 会理县|