SELECT DISTINCT id,addtime FROM table WHERE   ORDER BY addtime DESC.请问这语名是执行DISTINCT还是先执行ORDER BY。根据结果看,是先执行DISTINCT了,如果我想先执行ORDER BY,应该怎么写呢?即先排序而后再选择非重复!

解决方案 »

  1.   


    SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 
    2、where子句基于指定的条件对记录行进行筛选; 
    3、group by子句将数据划分为多个分组; 
    4、使用聚集函数进行计算; 
    5、使用having子句筛选分组; 
    6、计算所有的表达式; 
    7、使用order by对结果集进行排序。 
    另外:一个查询语句各个部分的执行顺序: 
    --8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
    --(1)  FROM <left_table> 
    --(3)    <join_type> JOIN <right_table> 
    --(2)      ON <join_condition> 
    --(4)  WHERE <where_condition> 
    --(5)  GROUP BY <group_by_list> 
    --(6)  WITH {CUBE | ROLLUP} 
    --(7)  HAVING <having_condition> 
    --(10) ORDER BY <order_by_list> 
      

  2.   

    看上面的提示,也就是先执行DISTINCT而后再执行ORDER BY,但是这样得到的结果不对,应该怎么先排序,而后再筛选呢?这样才能达到我需要的结果
      

  3.   


    在SQL语言中,第一个被处理的子句是FROM子句.每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对客户端应用程序或者外部查询不可用。只是最后一步生成的表才会返回 给客户端。即SQL执行步骤

    from
    on
    join
    where
    group
    with
    having
    select
    distinct
    order
    top逻辑说明:
    FROM:对FROM子句中的前两个表执行笛卡尔积(Cartesian product)(交叉联接),生成虚拟表Vtab1;
    ON:对Vtab1应用ON筛选器。只有那些使<join_condition>为真的行才被插入Vtab2;
    JOIN:如 果指定了OUTER JOIN(相对于CROSS JOIN 或(INNER JOIN),保留表(preserved table:左外部联接把左表标记为保留表,右外部联接把右表标记为保留表,完全外部联接把两个表都标记为保留表)中未找到匹配的行将作为外部行添加到 Vtab2,生成Vtab3.如果FROM子句包含两个以上的表,则对上一个联接生成的结果表和下一个表重复执行步骤1到步骤3,直到处理完所有的表为止。
    WHERE:对Vtab3应用WHERE筛选器。只有使<where_condition>为true的行才被插入Vtab4.
    GROUP BY:按GROUP BY子句中的列列表对Vtab4中的行分组,生成Vtab5.
    WITH CUBE|ROLLUP:把超组(Suppergroups)插入Vtab5,生成Vtab6.
    HAVING:对Vtab6应用HAVING筛选器。只有使<having_condition>为true的组才会被插入Vtab7.
    SELECT:处理SELECT列表,产生Vtab8.
    DISTINCT:将重复的行从Vtab8中移除,产生Vtab9.
    ORDER BY:将Vtab9中的行按ORDER BY 子句中的列列表排序,生成游标(Vtab10).即按ORDER BY子句中的列列表排序上步返回的行,返回游标VC10.这一步是第一步也是唯一一步可以使用SELECT列表中的列别名的步骤。这一步不同于其它步骤的 是,它不返回有效的表,而是返回一个游标,使用了ORDER BY子句的查询不能用作表表达式
    TOP:从Vtab10的开始处选择指定数量或比例的行,生成表Vtab11,并返回调用者。
      

  4.   

    能给出些实质性的回答么?复制来复制去的,不累啊?你不觉得手累,我还觉得眼累呢。谁给给我个具体的语名啊,就是先用ORDER BY排序后用DISTINCT筛选。谢谢啦!
    后面再想复制内容来回答的,请不要浪费时间与资源啦!
      

  5.   

    不知楼主可不可以写成两个query?比如:SELECT  DISTINCT id,addtime FROM (SELECT  id,addtime FROM table WHERE ORDER BY addtime DESC) a
      

  6.   

    SELECT  DISTINCT id,addtime FROM (SELECT TOP 100 percent id,addtime FROM table ORDER BY addtime DESC) as a
      

  7.   

    用这样的子查询就可以了  ORDER BY 需要使用 TOP 才能在子查询中使用 下面节选自 SQL 联机丛书:子查询的 SELECT 查询总是使用圆括号括起来。且不能包括 COMPUTE 或 FOR BROWSE 子句,如果同时指定 TOP 子句,则可能只包括 ORDER BY 子句。子查询可以嵌套在外部 SELECT、INSERT、UPDATE 或 DELETE 语句的 WHERE 或 HAVING 子句内,或者其它子查询中。尽管根据可用内存和查询中其它表达式的复杂程度不同,嵌套限制也有所不同,但嵌套到 32 层是可能的。个别查询可能会不支持 32 层嵌套。任何可以使用表达式的地方都可以使用子查询,只要它返回的是单个值。如果某个表只出现在子查询中而不出现在外部查询中,那么该表中的列就无法包含在输出中(外部查询的选择列表)。
      

  8.   


    这个对的,不过在什么情况下order by 顺序不同会产生不同的结果,感觉应该都是一样的,不管怎么排,都是会distinct的