2012-08-06 43 views
1

我有一個數據表變量:光標延遲結果集,如何使其有效

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遞減」所有結果第一組,然後在「DatabaseYear遞減」。

所以,我想出了一個光標,其執行以下操作:

  1. 獲得最新SITEID
  2. 把它放在另一張表(表變量是精確的)
  3. 得到所有其他記錄對於SITEID,按降序通過DatabaseYear
  4. 刪除所有記錄從第一臺

的習題LEM:

此邏輯運作良好,如果第一個表有幾千條記錄,但是當有超過5000的話,那麼它需要很多時間。由於這是填充網頁上的網格,我不能讓用戶等待時間超過15-20秒。在最壞的情況下(與超過40,000記錄),它需要2-3分鐘來執行。

任何建議,將不勝感激。

回答

2

你需要考慮更多的以成套方面,遊標是幾乎從來沒有正確的答案。你似乎想沿着勢在必行程序員的線條更。

這可以更簡單地比它最初出現做了很多:

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 example。)

+0

這是偉大的,完美的作品。我從來沒有用過。非常感謝。 SQL小提琴也很棒。 – Farhan 2012-08-06 16:24:04

1
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; 
+0

你的答案是偉大的,它是正是我需要的。我希望我能將你的回答標記爲答案。非常感謝。 – Farhan 2012-08-06 16:24:44