2014-11-20 63 views
0

是否可以在UsageCounts Select()查詢中使用HeaderID值?可以在子查詢中使用SELECT列值嗎?

SELECT HeaderID, HeaderName, HeaderFileName, CreatedDate, UsageCounts = (

     SELECT 
    COUNT(ClassXML.value('(/Data/prpID)[1]', 'INT')) 
    FROM CustomContent 
    WHERE ClassXML.value('(/Data/prpID)[1]', 'INT') = HeaderID 

) 
FROM Headers 

這是SQL Server 2008 R2的

更新:我想我得到一個結果集..它只是用了8分鐘。任何改進?

+0

以提高性能,可能得到的headerid,在CTE從XML內容計數,然後加入與頭部表。 – radar 2014-11-20 19:45:07

+0

這可能沒有幫助。 CTE就像函數一樣,每次在查詢中看到一個函數都可以重新運行。 – 2014-11-20 20:16:07

+0

可能會將子查詢結果存儲在臨時表中,因爲XML提取在sql server中速度很慢。 – radar 2014-11-20 21:24:13

回答

1

您可以嘗試聯接而不是子查詢來加速它。事情是這樣的:

Select 
    HeaderID, 
    max(HeaderName) HeaderName, 
    max(HeaderFileName) HeaderFileName, 
    max(CreatedDate) CreatedDate, 
    COUNT(ClassXML.value('(/Data/prpID)[1]', 'INT')) UsageCounts 
From Headers 
Left Join CustomContent on 
    ClassXML.value('(/Data/prpID)[1]', 'INT') = HeaderID 
Group by 
    HeaderID 

注:我假設你只有1個HeaderName,HeaderFileName和創建的每個HeaderID

4

Alias name並在correlated Subquery內使用它。

SELECT HeaderID, 
     HeaderName, 
     HeaderFileName, 
     CreatedDate, 
     UsageCounts =(SELECT Count(ClassXML.value('(/Data/prpID)[1]', 'INT')) 
         FROM CustomContent A 
         WHERE ClassXML.value('(/Data/prpID)[1]', 'INT') = H.HeaderID) 
FROM Headers H 
相關問題