使用COUNT(DISTINCT ..)时也使用INNER JOIN连接3个表,但Postgres一直出错

时间:2017-11-22 18:49:41

标签: sql postgresql count inner-join

我需要使用INNER JOIN来获取一系列信息,然后我需要COUNT这个信息。我需要能够“查看所有课程和讲授课程的教师,课程的容量以及当前在课程上预订的会员数量。”

要获取所有信息,我已完成以下查询:

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;

但无论我把COUNT放在哪里,它总是告诉我COUNT之外的任何东西应该在GROUP BY中

我已经弄清楚如何按必要的信息COUNT / GROUP BY:

SELECT courseID, COUNT (DISTINCT MC.memno)
FROM Membercourse AS MC
GROUP BY MC.courseID;

但我不知道如何将两者结合起来!

2 个答案:

答案 0 :(得分:0)

我认为你正在寻找的是一个子查询。我是一个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

......有意义吗?一旦你的子查询被写出来,你就不用再担心了 - 你只是将它视为你正在使用的表格。

这实际上非常重要,并且可以更容易地阅读更复杂的查询 - 特别是因为您可以用解释子查询表示数据方式的方式来命名子查询。

答案 1 :(得分:0)

有很多方法可以解决这个问题,例如使用Window Functions等。但您也可以使用简单的子查询来实现它:

SELECT
    C.coursename, 
    Instructors.fname, 
    Instructors.lname, 
    C.maxNo, 
    (SELECT 
        COUNT(*) 
    FROM 
        membercourse 
    WHERE 
        C.courseID = Membercourse.courseID) AS members
FROM 
    Courses AS C
    INNER JOIN Instructors ON C.instructorNo = Instructors.instructorNo;