我在使用以下SQL时,排序一直正常。select 
 ROW_NUMBER() Over(order by ins_task.last_contact_time asc) as rowNum,
   ins_task.guid taskGuid,
       ins_campaign.task_source as taskSource,
       ins_task.source_guid as sourceGuid,
       ins_task.assigned_to_user taskAssignedToUser,
       ins_task.assigned_by_user taskAssignedByUser,
       CONVERT(varchar(19), ins_task.create_date, 120) taskCreateDate,
       CONVERT(varchar(19), ins_task.last_contact_time, 120) lastContactTime,
 ins_task.last_contact_phone       lastContactPhone,
 ins_task.last_dict_talker lastDictTalker,
 ins_task.last_dict_contact_fail_reason lastDictContactFailReason,
(select name from sys_user where id = ins_task.last_contact_user ) lastContactUser
  from ins_task
  left join ins_campaign on (ins_task.campaign_guid = ins_campaign.guid)
 where ins_campaign.project_id = #projectId#但在该SQL中多加了几列,发现不按over()里面的last_contact_time排序了。select 
 ROW_NUMBER() Over(order by ins_task.last_contact_time asc) as rowNum,
   ins_task.guid taskGuid,
       ins_campaign.task_source as taskSource,
       ins_task.source_guid as sourceGuid,
       ins_task.assigned_to_user taskAssignedToUser,
       ins_task.assigned_by_user taskAssignedByUser,
       CONVERT(varchar(19), ins_task.create_date, 120) taskCreateDate,
       CONVERT(varchar(19), ins_task.last_contact_time, 120) lastContactTime,
 ins_task.last_contact_phone       lastContactPhone,
 ins_task.last_dict_talker lastDictTalker,
 ins_task.last_dict_contact_fail_reason lastDictContactFailReason,
(select name from sys_user where id = ins_task.last_contact_user ) lastContactUser,
(case when errorback_user is not null then (select name from sys_user su where su.id=errorback_user)
else (select name from sys_user su where su.id=checkclose_user) end) checkUserCN,
    (case when errorback_user is not null then convert(varchar(19),errorback_time,120)
else convert(varchar(19),checkclose_time,120) end) checkTime,
    (select name from sys_user su where su.id=errorclose_user) errorCloseCN,
    convert(varchar(19),errorclose_time,120) errorCloseTime
  from ins_task
  left join ins_campaign on (ins_task.campaign_guid = ins_campaign.guid)
 where ins_campaign.project_id = #projectId#请教高手。

解决方案 »

  1.   

    last_contact_time
    2009-11-24 18:56:49
    2009-11-24 18:56:49
    2009-11-24 18:56:55
    2009-11-24 18:56:58
    2009-11-24 18:57:02
    2009-11-17 14:55:29
    2009-11-17 14:55:38
    2009-11-17 14:55:40
    2009-11-17 14:55:41
    2009-11-17 14:55:41
    这是查询出来的,居然没有排序
      

  2.   

    可能性不大。
    估计楼主的语句有问题。 建议你能提供测试数据。建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  3.   

    (case
             when errorback_user is not null then
              (select name from sys_user su where su.id = errorback_user)
             else
              (select name from sys_user su where su.id = checkclose_user)
           end) checkUserCN,好像是这句的问题。去掉就正确了。哪道case when里面的查询会影响排序。
      

  4.   

    而且把里面的select改成
    (case
            when errorback_user is not null then
              errorback_user
            else
              checkclose_user
          end) checkUserCN, 也是可以正确排序的
      

  5.   

    还是看不出个所以然了。哎~~~今天在一个差不多的列表中加了个(select count(1) from ....)居然也把排序给搞乱了。
      

  6.   

    找到解决方法了。需要在整个SQL外面再来做一个order by 。
    看来
    ROW_NUMBER() Over(order by ins_task.last_contact_time asc) as rowNum
    仅仅只是一个评价函数,没有对结果集进行排序。