簡體   English   中英

同時使用INNER JOIN聯接3個表時使用COUNT(DISTINCT ..),但Postgres不斷出錯

[英]Using COUNT (DISTINCT..) when also using INNER JOIN to join 3 tables but Postgres keeps erroring

我需要使用INNER JOINs來獲取一系列信息,然后我需要對這一信息進行計數。 我需要能夠“查看所有課程以及參加這些課程的講師,課程的容量以及當前在課程上預訂的成員數量。”

要獲取所有信息,我已完成以下查詢:

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中

我已經解決了如何通過必要的信息來計數/組:

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

但我不知道如何將兩者結合!

我認為您正在尋找的是子查詢。 我是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;

好吧,現在,接下來呢?

好吧,比方說,我們想要對以上結果中每個“記憶”的條目進行計數。

而不是試圖找出如何修改上面的查詢,我們用它代替作為數據源,就像是一個表本身。

第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

... 說得通? 編寫完子查詢后,您無需再擔心它-您只需將其視為正在使用的表即可。

這實際上是非常重要的,它使讀取更復雜的查詢變得更加容易-尤其是因為您可以以解釋子查詢在數據上代表什么的方式命名子查詢。

有很多方法可以解決此問題,例如使用“窗口函數”等。 但是您也可以使用一個簡單的子查詢來實現它:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM