Postgres SQL:列必须出现在 GROUP BY 子句中或在聚合函数中使用

gen*_* b. 4 sql postgresql

(Postgres)

我不清楚以下内容:我正在选择各种字段,其中STUDY_T可能是带有聚合函数的子选择。我正在检索的一个独立字段是 LOOKUP_T join, lookupStudyType.description,它与任何聚合函数都不相关。但我收到错误

ERROR:  column "lookupstudytype.description" must appear in the GROUP BY clause or be used in an aggregate function
LINE 3:     lookupStudyType.description     AS studyTypeDescription,...
Run Code Online (Sandbox Code Playgroud)

为什么我不仅需要分组,s.id还需要分组lookupStudyType.description(而其他s.分组不是必需的)?

        SELECT 
            s.id                                        AS id, 
            lookupStudyType.description                 AS studyTypeDescription, 
            s.name                                      AS name, 
            s.abbreviation                              AS abbreviation, 
            s.start_date                                AS startDate, 
            s.end_date                                  AS endDate, 
            (SELECT COUNT(r.id)   
                FILTER 
                (WHERE r.status_id IN (76, 77) ))       AS  recallCount, 
            (SELECT COUNT(DISTINCT sp.id))              AS  participantCount, 
            (SELECT MAX(r.created_date) 
                FILTER 
                (WHERE r.status_id IN (76,77) ))        AS lastRecall,
            s.login_access_required                     AS loginAccessRequired, 
            s.description                               AS description, 
            s.custom_participant_exit_message           AS customParticipantExitMessage 
        FROM study_t s 
        INNER JOIN lookup_t lookupStudyType 
           ON s.study_type_id = lookupStudyType.id 
        INNER JOIN study_staff_t ss 
            ON s.id = ss.study_id 
        INNER JOIN users_t u 
            ON ss.researcher_id = u.id 
        LEFT JOIN study_participants_t sp 
            ON s.id = sp.study_id 
        LEFT JOIN recalls_t r 
            ON r.user_id = sp.user_id 
        WHERE  u.user_name = 'test@test.com'
        GROUP BY 
            s.id
        ORDER  BY s.abbreviation ASC
Run Code Online (Sandbox Code Playgroud)

The*_*ler 5

作为一般规则,子句中未列出的任何列都应聚合GROUP BY显示在列表中。SELECT

例如,s.name应该显示为max(s.name)或 ,min(s.name)因为它不存在于GROUP BY列表中。但是,PostgreSQL 为子句实现了函数依赖(SQL 标准功能)GROUP BY,并检测到该s.name依赖在s.id列中(可能是 PK);简而言之,s.name每个都有一个可能的值s.id。因此,PostgreSQL 中不需要聚合该列(可以,但不是必需的)。

另一方面,lookupStudyType.descriptionPostgreSQL 无法确定它在功能上s.id是否依赖。您需要将其聚合为max(lookupStudyType.description)ormin(lookupStudyType.description)或任何其他聚合表达式。

附带说明一下,我很少看到其他数据库中实现了函数依赖。PostgreSQL 不是很棒吗?(我不以任何方式隶属于 PostgreSQL)。