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”
因此,我提出了一个光标,它可以执行以下操作:
如果您有任何建议,我们将不胜感激。您需要更多地考虑集合,光标几乎永远都不是正确的答案。您似乎更多地按照命令式程序员的思路思考
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也很棒。您的答案很棒,这正是我需要的。我希望我也能把你的回答记为答案。谢谢。