版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yupeigu/article/details/79148844
标量子查询就是在select中出现的子查询,效率相对来说比较低,建议修改为效率更高的left join。
一、建表
CREATE TABLE tb_emp
(
emp_id INT NOT NULL PRIMARY KEY CLUSTERED,
emp_name VARCHAR(20) NOT NULL,
tel VARCHAR(20) null
)
INSERT INTO dbo.tb_emp
VALUES
(1, '张三','1234567890'),
(2, '李四','9876543210'),
(3, '王五','12345'),
(4, '孙六','666666666'),
(5, '半泽直树','8888888888');
CREATE TABLE tb_org
(
org_id INT NOT NULL PRIMARY KEY CLUSTERED,
org_name VARCHAR(30) NOT NULL,
parent_org_id INT NULL,
emp_id INT NULL
)
INSERT INTO tb_org(org_id,org_name,parent_org_id,emp_id)
VALUES
(1, '行长', NULL,1),
(2, '常务', 1,2),
(3, '专务', 1,3),
(4, '营业二部部长', 3,4),
(5, '营业二部次长', 4,5);
二、标量子查询写法
SELECT o.org_id,
o.org_name,
(SELECT emp_name FROM tb_emp e WHERE e.emp_id = o.emp_id) AS emp_name,
(SELECT tel FROM tb_emp e WHERE e.emp_id = o.emp_id) AS emp_tel
FROM tb_org o
执行计划:
三、left join写法
把标量子查询的写法,转成left join:
SELECT o.org_id,
o.org_name,
e.emp_name,
e.tel AS emp_tel
FROM tb_org o
LEFT JOIN tb_emp e
ON e.emp_id = o.emp_id
执行计划:
总结:
从上面的执行计划看,标量子查询的写法,对tb_emp访问了2次,而改写为left join的写法后,执行计划变得更简单,对tb_emp只访问了1次,效率的差异立见分晓。
另外,还有一个问题:虽然sql server的优化器会对sql进行优化,但是并不能把标量子查询,优化为left join的写法,因为优化器并不知道编写sql的人的意图到底是什么。
所以还是的大家写sql时,有意识的,少用标量子查询,多用join的写法来实现。