order by 是针对表列的,与是否为查询列好像无关吧.

解决方案 »

  1.   

    order by执行顺序应该在select之前
      

  2.   

    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> 
      

  3.   

    SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据;
     2、where子句基于指定的条件对记录行进行筛选; 
    3、group by子句将数据划分为多个分组; 
    4、使用聚集函数进行计算;
    5、使用having子句筛选分组; 
    6、计算所有的表达式; 
    7、使用order by对结果集进行排序。
      

  4.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2011-09-20 17:25:29
    -- Verstion:
    --      Microsoft SQL Server 2008 R2 (RTM) - 10.50.1617.0 (Intel X86) 
    -- Apr 22 2011 11:57:00 
    -- Copyright (c) Microsoft Corporation
    -- Enterprise Evaluation Edition on Windows NT 6.1 <X64> (Build 7600: ) (WOW64)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([id] int,[col] int)
    insert [tb]
    select 1,4 union all
    select 1,4 union all
    select 2,5 union all
    select 3,6
    --------------开始查询--------------------------
    select id from tb order by name
    ----------------结果----------------------------
    /* 消息 207,级别 16,状态 1,第 8 行
    列名 'name' 无效。*/
      

  5.   


    我的name列相当于你的col列
      

  6.   


    可能我没将清楚,test表包括两列,分别是id和name列
      

  7.   

    是先select出来id,然后再将结果按id对应的name排序而已...
      

  8.   

    SQL Server 查询处理中的各个阶段(SQL执行顺序)
      

  9.   

    select distinct id from tb order by id,name
    /*
    消息 145,级别 15,状态 1,第 1 行
    如果指定了 SELECT DISTINCT,那么 ORDER BY 子句中的项就必须出现在选择列表中。
      

  10.   

    執行策略
    1、在 FROM 子句中產生資料表的聯結。若使用明確的 JOIN 語法,則 JOIN 的結果就很明顯。如果 FROM 字句中含有多個以逗號分隔的資料表名稱,這就是資料表的隱含式跨產品聯結。
    2、若有 WHERE 子句,便對步驟 1 所得結果的資料列執行搜尋條件,只保留符合條件的資料列。
    3、如果 SELECT 子句中沒有任何彙總運算,而且如果沒有 GROUP BY 子句,則跳到步驟 7。
    4、如果有 GROUP BY 子句,則會將步驟 2 運算所得的資料列分為多個群組,因此所有群組資料行在每一個群組的所有資料列中具有相同的值。如果沒有 GROUP BY 子句,則將所有資料列放入一個群組中。
    5、若有指定 HAVING 子句,則針對步驟 4 所產生的每一個群組套用 HAVING 子句,只有符合 HAVING 子句的群組才會被保留。
    6、對於步驟 5 所產生的每一個群組,根據該群組評估來自 SELECT 子句中的選取清單,以便只產生一個結果資料列。 
    7、若 SELECT 子句包含 DISTINCT 關鍵字,則在步驟 6 所得的結果中刪除重複的資料列。
    8、如果有 ORDER BY 子句,則根據其順序運算式所指定的方式排列步驟 7 的結果。
      

  11.   

    Order by >distinct>select
      

  12.   

    以前我用PB或TOAD的时候一般是检索出来了,再排序的
      

  13.   


    當加了 distinct 時就與 select 列有關了
      

  14.   

    --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> 
    这个顺序是没错的,在查询的每个步骤中,按照这个顺序进行删选记录,形成虚拟表,包括select。最终得到满足所以条件的虚拟表,然后在投影出相应选择的列。我是这样理解的!!!可以看一下《sqlserver 2005 技术内幕 T-SQL查询》第一章 逻辑查询,那里面有记载,希望我理解的对,O(∩_∩)O~
      

  15.   

    先order by再select
    用下面的语句,再看看结果就知道了
    select top 3 * from student order by Sno desc
      

  16.   

    --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>