2012-01-27 59 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