当前位置:  开发笔记 > 编程语言 > 正文

Transact-SQL - 子查询还是左连接?

如何解决《Transact-SQL-子查询还是左连接?》经验,为你挑选了3个好方法。

我有两个包含任务和注释的表,并希望检索一个任务列表,其中包含每个任务和相关注释的数量.这两个查询完成了这项工作:

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

它们之间是否存在差异,我应该使用其中一个,还是仅仅是两种方式做同样的工作?谢谢.



1> Austin Salon..:

在小型数据集上,它们在性能方面是清洗的.索引时,LOJ稍好一些.

我在大型数据集上发现内部连接(内部连接也可以工作)会超出子查询的一个非常大的因素(对不起,没有数字).



2> Cade Roux..:

在大多数情况下,优化器会对它们进行相同的处理.

我倾向于选择第二种,因为它具有较少的嵌套,这使得它更容易阅读和更容易维护.出于同样的原因,我已经开始使用SQL Server的公用表表达式来减少嵌套.

此外,如果还有其他聚合,除了COUNT之外可以在将来添加聚合,如MIN(some_scalar),MAX(),AVG()等,第二种语法更灵活.



3> ConcernedOfT..:

子查询将在外部查询中的每一行执行时变慢.一旦完成,连接将更快.我相信查询优化器不会重写此查询计划,因为它无法识别等价.

通常你会为这种计数进行连接和分组.如果必须在未参与另一个连接的表上执行某些分组或更复杂的谓词,则您显示的排序的相关子查询主要是有意义的.

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有