前面几篇文章讲到了:
标量子查询、聚合标量子查询、行转列标量子查询、带top的标量子查询 如何转成left join。
之所以要转换,主要是因为标量子查询虽然写法上比较直观,容易理解,不用想就知道怎么写,但是存在:代码重复、多次访问同一个表 问题,所以效率比较低。
一、标量子查询的模板
按标量子查询方式,写出来的sql,都类似下面的代码:
select tb.col1,
tb.col2,
--下面的代码是重复的,表和连接条件都类似,只是最后显示的字段不同
(select x1 from t where t.id = tb.id) as x1,
(select x2 from t where t.id = tb.id) as x2,
(select x3 from t where t.id = tb.id) as x3,
(select x4 from t where t.id = tb.id) as x4,
...
from tb
可以看到,其中x1、x2、x3、x4等列,大部分代码都是重复的。
当然,代码重复本身并没有太大的问题,最多就是复制粘贴,拷贝多次,然后把字段名改改,就行了。
二、标量子查询的执行过程
上面的sql经过sql server的优化,生成执行计划,执行过程类似如下的过程:
(1)从tb表中取一条数据,用其中的id值,第1次和t表中的id值进行比较,如果相等,就返回t表的x1字段的值。
(2)从tb表中取一条数据,用其中的id值,第2次和t表中的id值进行比较,如果相等,就返回t表的x2字段的值。
(3)从tb表中取一条数据,用其中的id值,第3次和t表中的id值进行比较,如果相等,就返回t表的x2字段的值。
(4)从tb表中取一条数据,用其中的id值,第4次和t表中的id值进行比较,如果相等,就返回t表的x2字段的值。
(5)按照上述过程遍历整个tb表的每一条数据。
从上面的过程可以看出,一共访问了t表4次,做了很多无用功。
如果改成left join的方式,只需要访问1次t表,少访问3次,效率提高不少。
所以,要尽量少用标量子查询的写法。