优化SQL Server中的CASE测试

时间:2012-01-27 05:21:19

标签: sql-server sql-server-2008 case

我想知道是否有任何方法可以优化以下SELECT查询。 (注意:我在为不存在的表编写问题时输入了这个,我可能没有正确的语法。)

目标是,如果Table2包含任何相关的行,我想将第三列的值设置为Table2中相关行的数量。否则,如果Table3包含任何相关的行,我想将列设置为Table3中相关行的数量。否则,我想将列值设置为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

我不喜欢这样的事实,即我基本上执行两次相同的查询(在两种情况下)。有没有办法做我想要的只做一次查询?

请注意,这是包含多个JOINUNION的更大查询的一部分,因此采用完全不同的方法并不容易。

1 个答案:

答案 0 :(得分: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