最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

針對distinct疑問引發(fā)的一系列思考

 更新時間:2015年11月09日 10:15:58   作者:陳希章  
這篇文章主要針對distinct疑問引發(fā)的一系列思考,希望大家耐心閱讀,一定會有所收獲。

有人提出了這樣一個問題,整理出來給大家也參考一下

假設(shè)有如下這樣一張表格:

這里的數(shù)據(jù),具有如下的特征:在一個DepartmentId中,可能會有多個Name,反之也是一樣。就是說Name和DepartmentId是多對多的關(guān)系。

現(xiàn)在想實現(xiàn)這樣一個查詢:按照DepartmentID排完序之后(第一步),再獲取Name列的不重復(fù)值(第二步),而且要保留在第一步后的相對順序。以本例而言,應(yīng)該返回三個值依次是:ACB

我們首先會想到下面這樣一個寫法

select distinct name from Sample order by DepartmentId

從語義上說,這是很自然的。但是很可惜,這個語句根本無法執(zhí)行,錯誤消息是:

這個錯誤的意思是,如果使用了DISTINCT(去重復(fù)值),則出現(xiàn)在OrderBy后面的字段,必須也出現(xiàn)在SELECT后面,但如果DepartmentID如果也真的出現(xiàn)在SELECT后面,顯然是不會有重復(fù)值的,所以結(jié)果肯定也是不對的。

select distinct name,DepartmentId from Sample order by DepartmentId


 

那么,既然DISINCT 與OrderBy結(jié)合起來用會有這個的一個問題,我們是否有可能變通一下,例如下面這樣:

SELECT distinct a.Name
FROM (select top 100 percent name from Sample order by DepartmentId) a

想比較之前的寫法,我們用到了子查詢技術(shù)。同樣從語義上看,仍熱是很直觀明了的。我想先按照DepartmentId進行排序, 然后再去重復(fù)值。但是返回到結(jié)果是下面這樣的:

雖然確實去除了重復(fù)值,但返回的順序卻是不對的。我們希望是先按照DepartmentId排序之后,然后去除重復(fù)值,并且保留排序后的相對順序。

為什么會出現(xiàn)上面這個結(jié)果呢?其實是因為DISTINCT本身是會做排序的,而且這個行為是無法更改的(下圖的執(zhí)行計劃中可以看到這一點)。所以其實我們之前做的Order by在這里會失去意義?!緦嶋H上,如果觀察ADO.NET Entity Framework等ORM工具中生成的類似的一個查詢,它會自動丟棄Order by的設(shè)置】

那么,這樣的情況下,是不是就不可能實現(xiàn)需求了呢?雖然說,這個需求并不多見,絕大部分時候,DISTINCT作為最后一個操作,做一次排序是合乎情理的。

我是這樣考慮到,既然DISTINCT的這個行為是內(nèi)置的,那么是否可以繞過這個操作呢?最終我用的一個解決方案是:我能不能把每個Name都編上一個編號,例如有兩個A的話,第一個A我為它編號為1,第二個編號為2,以此類推。然后,查詢的時候,我先排序,然后篩選那些編號為1的Name,這樣其實也就實現(xiàn)了去重復(fù)值了。

SQL Server 2005開始提供了一個ROW_NUMBER的功能,結(jié)合這個功能,我實現(xiàn)了下面這樣的查詢:

select a.Name from 
(select top 100 percent
Name,DepartmentId,ROW_NUMBER() over(partition by name order by departmentid) row
from Sample order by DepartmentId) a
where a.row=1
order by a.DepartmentId

然后,我得到了下面這樣的結(jié)果,我推敲下來,這應(yīng)該是符合了之前提到的這個需求的

相比較而言,這個查詢的效率會低一些,這個是可以預(yù)見的(可以通過下圖看出一點端倪)。但如果需求是硬性的,那么犧牲一些性能也是不奇怪的。當(dāng)然,我們可以再研究看看是否有更優(yōu)的一些寫法。無論如何,使用內(nèi)置標(biāo)準(zhǔn)的實現(xiàn),通常都是相對較快的。

以上就是關(guān)于distinct疑問引發(fā)的一系列思考,希望對大家的學(xué)習(xí)有所幫助。

相關(guān)文章

  • delete from 表名與truncate table 表名區(qū)別

    delete from 表名與truncate table 表名區(qū)別

    delete from 表名與truncate table 表名區(qū)別,選擇適合我們的刪除數(shù)據(jù)庫數(shù)據(jù)的方法
    2012-10-10
  • 基于SSIS 事件的向上傳遞(詳解)

    基于SSIS 事件的向上傳遞(詳解)

    下面小編就為大家分享一篇基于SSIS 事件的向上傳遞(詳解),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • SQL Server允許重復(fù)空字段不空字段值唯一

    SQL Server允許重復(fù)空字段不空字段值唯一

    今天同學(xué)向我提了一個問題,我覺得蠻有意思,現(xiàn)記錄下來大家探討下。問題是:在一個表里面,有一個允許為空的字段,空是可以重復(fù)的,但是不為空的值需要唯一。
    2011-03-03
  • SQL server 中 CROSS APPLY的使用及用途

    SQL server 中 CROSS APPLY的使用及用途

    CROSS APPLY是SQL Server中的操作符,用于將表表達式與外部表連接,它允許在查詢中多次引用外部表的行,并根據(jù)每行動態(tài)生成結(jié)果集,而OUTER APPLY則類似于LEFT JOIN,后者即使子查詢無結(jié)果也會顯示外部表的行,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • T-SQL篇如何防止SQL注入的解決方法

    T-SQL篇如何防止SQL注入的解決方法

    所謂SQL注入式攻擊,就是攻擊者把SQL命令插入到Web表單的輸入域或頁面請求的查詢字符串,欺騙服務(wù)器執(zhí)行惡意的SQL命令,對于這種行為,我們應(yīng)該如何制止呢?本文將介紹一種方法,希望可以幫助有需要的朋友
    2012-11-11
  • SQL Server Alwayson創(chuàng)建代理作業(yè)的注意事項詳解

    SQL Server Alwayson創(chuàng)建代理作業(yè)的注意事項詳解

    在工作中有時為了避免數(shù)據(jù)庫增長太大所以需要定時來刪除某段時間前的數(shù)據(jù),所以使用代理作業(yè)的方式來實現(xiàn)定時刪除的功能,下面這篇文章主要給大家介紹了關(guān)于SQL Server Alwayson創(chuàng)建代理作業(yè)的注意事項,需要的朋友可以參考下。
    2017-09-09
  • 揭秘SQL Server 2014有哪些新特性(1)-內(nèi)存數(shù)據(jù)庫

    揭秘SQL Server 2014有哪些新特性(1)-內(nèi)存數(shù)據(jù)庫

    微軟SQL Server 2014提供了眾多激動人心的新功能,但其中最讓人期待的特性之一就是代號為” Hekaton”的內(nèi)存數(shù)據(jù)庫了,內(nèi)存數(shù)據(jù)庫特性并不是SQL Server的替代,而是適應(yīng)時代的補充,現(xiàn)在SQL Server具備了將數(shù)據(jù)表完整存入內(nèi)存的功能。那么今天我們就先來看看內(nèi)存數(shù)據(jù)庫
    2014-08-08
  • 為數(shù)據(jù)庫生成某個字段充填隨機數(shù)的存儲過程

    為數(shù)據(jù)庫生成某個字段充填隨機數(shù)的存儲過程

    為數(shù)據(jù)庫生成某個字段充填隨機數(shù)
    2010-05-05
  • 整理一下SQLSERVER的排序規(guī)則

    整理一下SQLSERVER的排序規(guī)則

    整理一下SQLSERVER的排序規(guī)則...
    2006-09-09
  • SQL語句查詢數(shù)據(jù)庫中重復(fù)記錄的個數(shù)

    SQL語句查詢數(shù)據(jù)庫中重復(fù)記錄的個數(shù)

    一個sql語句:一個表test有四個字段id,a,b,c,如果表中的記錄有三個字段a,b,c都相等,則說明這條記錄是相同的,求相同的記錄的個數(shù) 。
    2009-11-11

最新評論

左云县| 阳江市| 富阳市| 比如县| 万全县| 深圳市| 城口县| 正阳县| 张家界市| 嘉祥县| 郓城县| 栖霞市| 庆阳市| 威信县| 遂宁市| 云梦县| 青阳县| 广元市| 大兴区| 盱眙县| 理塘县| 乌兰浩特市| 花莲县| 长治县| 明水县| 岚皋县| 科尔| 建阳市| 从化市| 甘泉县| 周宁县| 偃师市| 炎陵县| 阆中市| 乐业县| 静海县| 和林格尔县| 东港市| 神池县| 怀来县| 奇台县|