2013-04-05 25 views
0

我有一個文件表說領域可能消除這個子查詢?

DocumentID int - PK and autoincrement 
LastStatusChangedDateTime - datetime 
JurisdictionID - int 
DocumentStatusID - int 

現在我想在名爲CanChangeStatus計算列帶上。這就像一個隊列。所以,如果文件是第一個在它的狀態可以改變。這是我的查詢:

Select d.DocumentID, 
(
    Select Cast(Case When d.DocumentID = v.DocumentID Then 1 Else 0 End as bit) 
    From 
    (
     Select Top 1 DocumentID 
     From Documents 
     Where JurisdictionID = d.JurisdictionID 
      And 
     DocumentStatusID = d.DocumentStatusID 
     Order By LastStatusChangedDateTime 
    ) v 
) as CanChangeStatus  
From Documents d 

指數是那裏JurisdictionIDDocumentStatusID。罪魁禍首是子查詢 - 我試圖計算CanChangeStatus的方式。有什麼辦法可以加快速度或將此子查詢轉換爲連接,因爲連接是主要是快於子查詢?

+0

這是否真的需要在SQL做或可能多數民衆贊成處理這個回報執行的操作?它消除了您的子查詢和連接,並將邏輯放入應用程序中。 – 2013-04-05 06:43:39

回答

5

你應該能夠聚合函數(上SQLFiddle例子)來做到這一點:

SELECT DocumentID, 
     CASE WHEN ROW_NUMBER() OVER (PARTITION BY JurisdictionID, DocumentStatusID 
            ORDER BY LastStatusChangedDateTime) 
     = 1 THEN 1 ELSE 0 END AS Bit 
FROM Documents 
+0

Woot Woot!完善!!! – Jack 2013-04-05 06:46:51

+0

+1爲快速邏輯:) – TechDo 2013-04-05 06:48:51

+1

我很震驚!我的查詢花了5秒鐘的時間查詢,現在需要300到500毫秒。 – Jack 2013-04-05 07:05:56

0
Select Cast(Case When TOP_DocumentID = DocumentID Then 1 Else 0 End as bit), DOCUMENTID 
FROM 
(
Select TOP 1 DOCUMENT_ID TOP_DocumentID, D.DOCUMENTID 
From Documents d, DOCUMENTS J 
Where J.JurisdictionID = d.JurisdictionID 
And J.DocumentStatusID = d.DocumentStatusID 
Order By J.LastStatusChangedDateTime 
) A