(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)
作为一般规则,子句中未列出的任何列都应聚合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)。
| 归档时间: |
|
| 查看次数: |
12869 次 |
| 最近记录: |