基于In子句中的顺序的SQL排序

时间:2011-09-22 14:35:34

标签: tsql sorting

该方案首先运行昂贵的排序查询,并将第一个100,000主键(Int32)保存在.NET列表中。然后从大约十二个表中一次检索100行细节。详细查询的格式为:

    select ... from DetailA where PK in (sorted list of 100 PK).  

问题是返回没有按照in子句中的顺序排序。需要详细分类。不希望应用用于创建100,000主列表的排序,因为这是一种昂贵且混乱的排序。

我的想法是将100 PK加载到#tempSort表中并将其用于排序。有更好的方法吗?

目前使用SQLDataReader一次获取一行详细信息,大约需要2秒。测试使用具有多个DataTable的DataSet一次性获取所有数据,并且使用SQLDataReader一次比一行慢一个因子3.这些数据被加载到对象中,因此需要DataSet的高级功能。

我不想在#temp中保存100,000个主结果,因为这是一个很大的活动数据库,需要将负载移到客户端。

按照建议尝试表值参数 这是正确的语法吗?

    CREATE TYPE sID100 AS TABLE 
    ( sID INT, sortOrder INT );
    GO

    /* Declare a variable that references the type. */
    DECLARE @sID100 AS sID100;

    /* Add data to the table variable. */
    INSERT INTO @sID100  (sID, sortOrder) 
    values (100, 1), (200,2), (50,3);

    Select * from @sID100;
    select docSVsys.sID, docSVsys.addDate 
    from docSVsys 
    join @sID100 as [sID100] 
    on [sID100].sID = docSVsys.sID 
    order by [sID100].sortOrder
    GO

    Drop TYPE sID100 

以上不是最佳选择。我正在学习,但在C#中可以创建一个DataTable并使用Tabel-Value Parameters将其传递给存储过程。正如马丁在评论中所说的那样,但在我理解他的话之前,我们进行了一些研究。

1 个答案:

答案 0 :(得分:1)

IN子句中PK的顺序无关紧要。
只有最外层的ORDER BY很重要:如果没有指定,任何订单都是任意的

select ...
from DetailA
where PK in (sorted list of 100 PK)
ORDER BY PK

From MSDN ORDER BY

  

在视图,内联函数,派生表或子查询的定义中使用ORDER BY时,该子句仅用于确定TOP子句返回的行。在查询这些结构时,ORDER BY子句不保证有序结果,除非在查询本身中也指定了ORDER BY。

编辑后,反馈并包括马丁史密斯的想法

select ...
from DetailA A
     JOIN
     TVPorTemptable T ON A.PK = T.PK
ORDER BY
  T.OrderByCOlumn