2013-04-05 4 views
0

J'ai une table de documents avec des champs dire quePossible d'éliminer cette sous-requête?

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

maintenant je veux apporter une colonne calculée nommée CanChangeStatus. C'est comme une file d'attente. Donc, si le document est premier dans son statut peut être changé. Ceci est ma requête:

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 

Index est là JurisdictionID et DocumentStatusID. Le coupable est la sous-requête - la façon dont j'essaie de calculer CanChangeStatus. Est-il possible que je puisse accélérer cela ou convertir cette sous-requête en jointure parce que les jointures sont principalement plus rapidement que les sous-requêtes?

+0

Est-ce vraiment besoin d'être fait dans SQL ou pourrait que est le traitement de ce retour effectuer l'action? Il élimine votre sous-requête et la jointure et place la logique dans l'application. –

Répondre

5

Vous devriez être en mesure de le faire avec une fonction d'agrégation (exemple sur 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! Parfait!!! – Jack

+0

+1 pour la logique rapide :) – TechDo

+1

Je suis stupéfait! Ma requête a pris 5 secondes avec la sous-requête et maintenant cela prend entre 300 et 500 ms. – Jack

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 
Questions connexes