您如何将以下查询尽可能地重写为一个没有子查询的查询?
Select dept name,
(Select Count(*)
From instructor
Where department.dept name = instructor.dept name
) As num_instructors
From department;
我想出了以下几点。与上面的等效吗?
Select dept name, count(*)
From department, instructor
Where department.dept name = instructor.dept name
Group By department.dept_name;
谢谢。
答案 0 :(得分:2)
编写查询的正确方法使用显式JOIN
语法:
select d.dept_name, count(i.dept_name)
from department d left join
instructor i
on d.dept_name = i.dept_name
group by d.dept_name;
如果您只关心至少有一名讲师的部门,则根本不需要join
:
select i.dept_name, count(*)
from instructor i
group by i.dept_name;
答案 1 :(得分:1)
您的尝试真的很接近,只有几件事。
您应该使用显式联接(即JOIN
,LEFT JOIN
等),而不是隐式联接(FROM
子句中的逗号)。隐式联接的折旧年限为25年以上。
此外,在这种情况下,您将需要LEFT JOIN
或不显示没有讲师的部门。 LEFT JOIN
将保留没有教员的部门,并给您一个0计数(如第一个查询),其中JOIN
根本不会显示这些部门。
SELECT d.dept_name, COUNT(i.dept_name) as num_instructors
FROM department d
LEFT JOIN instructors i on d.dept_name = i.dept_name
GROUP BY d.dept_name