2012-01-27 90 views
0

我想知道是否有任何方法來優化以下SELECT查詢。 (注:寫我的問題時不存在的表,我可能沒有正確的語法我打這個。)在SQL Server中優化CASE測試

的目標是,如果表2中包含任何相關行我想要的第三列的值設置爲數字Table2中的相關行。否則,如果Table3包含任何相關的行,我想將列設置爲表3中相關行的數目。否則,我想列值設置爲0

SELECT Id, Title, 
    CASE 
     WHEN EXISTS (SELECT * FROM Table2 t2 WHERE t2.RelatedId = Table1.Id) THEN 
      (SELECT COUNT(1) FROM Table2 t2 WHERE t2.RelatedId = Table1.Id) 
     WHEN EXISTS (SELECT * FROM Table3 t3 WHERE t3.RelatedId = Table1.Id) THEN 
      (SELECT COUNT(1) FROM Table3 t3 WHERE t3.RelatedId = Table1.Id) 
     ELSE 0 
    END AS RelatedCount 
    FROM Table1 

我不喜歡的事實,我基本上執行相同的查詢兩次(在兩種情況下)。有沒有辦法做到我想要的,而只執行一次查詢?

請注意,這是一個更大的查詢的一部分,其中有多個JOIN s和UNION s,因此採用完全不同的方法並不容易。

回答

1

該查詢應該更好。你不只是執行兩次相同的查詢;因爲它們是相關的子查詢,它們將每行運行一次。

SELECT Id, Title, 
    coalesce(t2.Count, t3.Count, 0) AS RelatedCount 
    FROM Table1 t 
left outer join (
    SELECT RelatedId, count(*) as Count 
    FROM Table2 
    group by RelatedId 
) t2 on t1.Id = t2.RelatedId 
left outer join (
    SELECT RelatedId, count(*) as Count 
    FROM Table3 
    group by RelatedId 
) t3 on t1.Id = t3.RelatedId 
+0

我在努力去理解這一點。既然你加入了'RelatedId',那麼'GROUP'的優點是什麼呢?另外,爲什麼使用'JOIN's?它不是簡單地將COUNT(*)作爲單獨的列嗎? – 2012-01-27 05:37:57

+0

@JonathanWood GROUP BY允許我們計算每個'RelatedId'有多少條記錄。我不遵循你的第二句話。例? – RedFilter 2012-01-27 05:40:48

+0

我想我明白了。在應用「COUNT」之前進行分組,以便「ON」子句返回我們想要的總數。 T-SQL不是我的第一語言,這對我來說看起來很奇怪。運行一些測試... – 2012-01-27 05:51:02