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

と にインデックスがありJurisdictionIDますDocumentStatusID。犯人はサブクエリです - 私が計算しようとしている方法ですCanChangeStatus結合はサブクエリよりもほとんど高速であるため、これを高速化するか、このサブクエリを結合に変換する方法はありますか?

4

2 に答える 2

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
于 2013-04-05T06:40:38.860 に答える
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
于 2013-04-05T06:38:30.907 に答える