我有两个包含任务和注释的表,并希望检索一个任务列表,其中包含每个任务和相关注释的数量.这两个查询完成了这项工作:
select t.TaskId, (select count(n.TaskNoteId) from TaskNote n where n.TaskId = t.TaskId) 'Notes' from Task t -- or select t.TaskId, count(n.TaskNoteId) 'Notes' from Task t left join TaskNote n on t.TaskId = n.TaskId group by t.TaskId
它们之间是否存在差异,我应该使用其中一个,还是仅仅是两种方式做同样的工作?谢谢.
在小型数据集上,它们在性能方面是清洗的.索引时,LOJ稍好一些.
我在大型数据集上发现内部连接(内部连接也可以工作)会超出子查询的一个非常大的因素(对不起,没有数字).
在大多数情况下,优化器会对它们进行相同的处理.
我倾向于选择第二种,因为它具有较少的嵌套,这使得它更容易阅读和更容易维护.出于同样的原因,我已经开始使用SQL Server的公用表表达式来减少嵌套.
此外,如果还有其他聚合,除了COUNT之外可以在将来添加聚合,如MIN(some_scalar),MAX(),AVG()等,第二种语法更灵活.
子查询将在外部查询中的每一行执行时变慢.一旦完成,连接将更快.我相信查询优化器不会重写此查询计划,因为它无法识别等价.
通常你会为这种计数进行连接和分组.如果必须在未参与另一个连接的表上执行某些分组或更复杂的谓词,则您显示的排序的相关子查询主要是有意义的.