我认为您正在寻找的是子查询。我是一个 SQL-Server 人(不是 postgresql),但经过一些速成课程 postgresql 谷歌搜索后,这个概念看起来几乎相同。
无论如何,基本上,当您编写 SELECT 语句时,您可以使用子查询而不是实际的表。所以你的 SQL 看起来像:
select count(*)
from
(
select stuff from table
inner join someOtherTable
)
...希望这是有道理的。与其尝试编写一个同时进行内部联接和计数的大查询,不如编写两个:一个获取内部联接数据的内部查询,然后是实际计算行数的外部查询。
编辑:帮助解释更多关于子查询背后的思考过程。
子查询是一种在逻辑上分解数据步骤/过程的方法。与其尝试一步一步完成所有事情,不如分步进行。
在这种情况下,第一步是什么?这是为您的合并的、内部连接的数据获取一个合并的数据源。
第 1 步:编写内部联接查询
SELECT
C.coursename, Instructors.fname, Instructors.lname,C.maxNo,
membercourse.memno
FROM Courses AS C
INNER JOIN Instructors ON C.instructorNo = Instructors.instructorNo
INNER JOIN Membercourse ON C.courseID = Membercourse.courseID;
好的,现在,下一步是什么?
好吧,假设我们想要计算上述结果中每个“memno”有多少条目。
我们没有尝试弄清楚如何修改上面的查询,而是将其用作数据源,就像它本身就是一个表一样。
第 2 步 - 将其设为子查询
select * from
(
SELECT
C.coursename, Instructors.fname, Instructors.lname,C.maxNo,
membercourse.memno
FROM Courses AS C
INNER JOIN Instructors ON C.instructorNo = Instructors.instructorNo
INNER JOIN Membercourse ON C.courseID = Membercourse.courseID
) mySubQuery
第 3 步 - 修改外部查询以获取所需数据。
嗯,我们想按 'memno' 分组,然后得到计数,对吧?所以...
select memno, count(*)
from
(
-- all that same subquery stuff
) mySubQuery
group by memno
...有意义吗?写出子查询后,您无需再担心它 - 您只需将其视为正在使用的表即可。
这实际上非常重要,并且可以更轻松地阅读更复杂的查询 - 特别是因为您可以通过解释子查询代表数据的方式来命名子查询。