淺談資料庫去重

來源:互聯網
上載者:User

標籤:os   io   資料   art   ar   div   new   htm   

  關於sql去重,我簡單談一下自己的簡介,如果各位有建議或有不明白的歡迎多多指出。推薦網址:www.4-yecao.com

  關於sql去重最常見的有兩種方式:DISTINCT和ROW_NUMBER(),當然了ROW_NUMBER()除了去重還有很多其他比較重要的功能,一會我給大家簡單說說我自己在實際中用到的。

 

  假如有張UserInfo表,如:

   

  現在我們要去掉完全重複的資料:SELECT DISTINCT * FROM dbo.UserInfo結果如:

  

  但是現在有個新的需求,要把名字為‘張三’的去重,也就是相同名字的只要一條資料,要是還用DISTINCT的話就很麻煩了。想必聰明的你已經想到此時是ROW_NUMBER()登場的時候了吧。我們只需執行這樣一句話就萬事大吉了SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID) AS RowId,* FROM dbo.UserInfo) x WHERE x.RowId=1;雖然看起來有點長,但是很容易理解。現在執行的結果如:

  

  現在名字重複的資料只取了一條,而且是根據sql語句中的ORDER BY ID取的第一條,其中PARTITION BY後面跟的就是去重的欄位,也許你想問為什麼要加WHERE x.RowId=1呢,現在我們不加這個條件看看結果如何:SELECT * FROM (SELECT ROW_NUMBER() OVER(PARTITION BY Name ORDER BY ID) AS RowId,* FROM dbo.UserInfo) x,如:

  

  現在我們已經看到,如果不加條件會把所有資料都查出來,所以RowId=1的資料就是去重後的資料;

 

  ROW_NUMBER()除了可以去重還可以得到表的行號,現在我們只需一下語句:SELECT ROW_NUMBER() OVER(ORDER BY ID) AS RowNum,* FROM dbo.UserInfo,結果如:

  

  得到了所有的資料,而且還得到了每條資料的行號,其中資料的順序可以根據ORDER BY ID調節,也就是說不去重的話就不用加PARTITION BY Name了,此功能在分頁中用的也比較多,假如每頁15條資料,分頁時直接加條件RowNum Between 1 AND 15就行了。孤狼發表的部落格很少,平時也比較懶,希望對大家有用。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.