如何在SELECT子句中用子查询重写查询?

时间:2018-06-25 18:56:27

标签: sql postgresql

您如何将以下查询尽可能地重写为一个没有子查询的查询?

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;

谢谢。

2 个答案:

答案 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)

您的尝试真的很接近,只有几件事。

您应该使用显式联接(即JOINLEFT 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