Sql 游标延迟结果集,如何使其高效

Sql 游标延迟结果集,如何使其高效,sql,sql-server,sql-server-2008,cursor,Sql,Sql Server,Sql Server 2008,Cursor,我有一个包含数据的表变量: SiteID DatabaseYear CreationDate 1 2011 2012.01.01 2 2012 2012.06.06 3 2010 2010.10.10 1 2012 2012.07.07 3 2012 2012.07.27 4 2012 2012.08.31 在一

我有一个包含数据的表变量:

SiteID  DatabaseYear  CreationDate
1       2011          2012.01.01
2       2012          2012.06.06
3       2010          2010.10.10
1       2012          2012.07.07
3       2012          2012.07.27
4       2012          2012.08.31
在一个完美的世界中,我想对结果进行如下排序:

SiteID  DatabaseYear  CreationDate
4       2012          2012.08.31
3       2012          2012.07.27
3       2010          2010.10.10
1       2012          2012.07.07
1       2011          2012.01.01
2       2012          2012.06.06
排序如下:获取具有最新创建日期的站点并首先显示(按CreationDate描述排序),然后获取该站点的所有其他记录并按DatabaseYear显示(按DatabaseYear描述排序)

当然,以下这些根本不起作用:

order by CreationDate desc, DatabaseYear desc
因为它将首先对整个结果集应用“CreationDate desc”,然后对“DatabaseYear desc”

因此,我提出了一个光标,它可以执行以下操作:

  • 获取最新的站点ID
  • 将其放在另一个表中(确切地说是表变量)
  • 获取该站点ID的所有其他记录,按数据库年份降序排列
  • 从第一个表中删除该表的所有记录
  • 问题是:

    如果第一个表有几千条记录,那么这种逻辑工作得很好,但是当记录超过5000条左右时,则需要更长的时间。由于这是在网页上填充网格,我不能让用户等待超过15-20秒。在最坏的情况下(超过40000条记录),执行需要2-3分钟


    如果您有任何建议,我们将不胜感激。

    您需要更多地考虑集合,光标几乎永远都不是正确的答案。您似乎更多地按照命令式程序员的思路思考

    DECLARE @t TABLE  
    (
      SiteID INT,  
      DatabaseYear INT,  
      CreationDate DATE
    );
    
    INSERT @t VALUES
    (1,2011,'2012-01-01'),
    (2,2012,'2012-06-06'),
    (3,2010,'2010-10-10'),
    (1,2012,'2012-07-07'),
    (3,2012,'2012-07-27'),
    (4,2012,'2012-08-31');
    
    ;WITH x AS 
    (
      SELECT SiteID, d = MAX(CreationDate) 
         FROM @t
         GROUP BY SiteID
    )
    SELECT t.SiteID, t.DatabaseYear, t.CreationDate 
    FROM @t AS t
    INNER JOIN x 
    ON t.SiteID = x.SiteID
    ORDER BY x.d DESC, t.CreationDate DESC;
    
    这可以比最初看起来简单得多:

    WITH Most_Recent_Site (siteId, createdOn) as (SELECT id, MAX(createdOn)
                                                  FROM Site_Data
                                                  GROUP BY id)
    
    SELECT Site_Data.id, Site_Data.createdOn
    FROM Site_Data
    JOIN Most_Recent_Site
    ON Most_Recent_Site.siteId = Site_Data.id
    ORDER BY Most_Recent_Site.createdOn DESC, Site_Data.createdOn DESC
    
    我故意省略了“数据库年”列,因为它似乎没有增加任何价值


    (我有一个工作模式。)

    这很好,工作非常完美。我从来没有用过。谢谢。SQL Fiddle也很棒。您的答案很棒,这正是我需要的。我希望我也能把你的回答记为答案。谢谢。