我想知道是否有任何方法可以优化以下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
我不喜欢这样的事实,即我基本上执行两次相同的查询(在两种情况下)。有没有办法做我想要的只做一次查询?
请注意,这是包含多个JOIN
和UNION
的更大查询的一部分,因此采用完全不同的方法并不容易。
答案 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