可以消除这个子查询?

Jac*_*ack 0 sql t-sql sql-server sql-server-2012

我有一个说明字段的文件表

DocumentID int - PK and autoincrement 
LastStatusChangedDateTime - datetime 
JurisdictionID - int 
DocumentStatusID - int
Run Code Online (Sandbox Code Playgroud)

现在我想引入一个名为的计算列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
Run Code Online (Sandbox Code Playgroud)

指数是那里JurisdictionIDDocumentStatusID.罪魁祸首是子查询 - 我试图计算的方式CanChangeStatus.有什么方法可以加快速度或将此子查询转换为连接,因为连接大多比子查询快?

Pet*_*ang 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
Run Code Online (Sandbox Code Playgroud)