加入派生的 table postgres
Joining a derived table postgres
我有 4 个 table:
- 能力:明显的能力列表,静态和库
- 能力水平:指的是一组相关的能力,并且有一些我正在测试的能力
- call_competency:记录了指定能力
的所有'calls'的列表
- competency_review_status:证明每个call_competency是否被审查
现在我正在尝试编写此查询来计算总数并吐出能力、id 以及用户是否已达到限制。一切正常,除了我添加用户时。我不确定我做错了什么,一旦我在 where 子句中限制了用户的调用能力,当我想要整个能力列表时,我会得到一个只存在于 call_competency 中的小子集。
未达到的能力应为假,记录适当数量的为真。来自能力 table 的完整列表。
我添加了派生的 table,不确定这是否正确,显然它 运行 不正确,不确定我做错了什么,我在浪费时间。非常感谢任何帮助。
SELECT comp.id, comp.shortname, comp.description,
CASE WHEN sum(CASE WHEN crs.grade = 'Pass' THEN 1 ELSE CASE WHEN crs.grade = 'Fail' THEN -1 ELSE 0 END END) >= comp_l.competency_break_level
THEN TRUE ELSE FALSE END
FROM competencies comp
INNER JOIN competency_levels comp_l ON comp_l.competency_group = comp.competency_group
LEFT OUTER JOIN (
SELECT competency_id
FROM call_competency
WHERE call_competency.user_id IN (
SELECT users.id FROM users WHERE email= _studentemail
)
) call_c ON call_c.competency_id = comp.id
LEFT OUTER JOIN competency_review_status crs ON crs.id = call_competency.review_status_id
GROUP BY comp.id, comp.shortname, comp.description, comp_l.competency_break_level
ORDER BY comp.id;
(偷拍,未安装测试)
看起来下面应该可以解决问题。您显然混淆了一些联接,其中有一个来自未引用的关系的列。此外,主查询中的 CASE
语句可以更简洁。
SELECT comp.id, comp.shortname, comp.description,
(sum(CASE WHEN crs.grade = 'Pass' THEN 1 WHEN crs.grade = 'Fail' THEN -1 ELSE 0 END) >= comp_l.competency_break_level) AS reached_limit
FROM competencies comp
JOIN competency_levels comp_l USING (competency_group)
LEFT JOIN (
SELECT competency_id, review_status_id
FROM call_competency
JOIN users ON id = user_id
WHERE email = _studentemail
) call_c ON call_c.competency_id = comp.id
LEFT JOIN competency_review_status crs ON crs.id = call_c.review_status_id
GROUP BY comp.id, comp.shortname, comp.description
ORDER BY comp.id;
我有 4 个 table:
- 能力:明显的能力列表,静态和库
- 能力水平:指的是一组相关的能力,并且有一些我正在测试的能力
- call_competency:记录了指定能力 的所有'calls'的列表
- competency_review_status:证明每个call_competency是否被审查
现在我正在尝试编写此查询来计算总数并吐出能力、id 以及用户是否已达到限制。一切正常,除了我添加用户时。我不确定我做错了什么,一旦我在 where 子句中限制了用户的调用能力,当我想要整个能力列表时,我会得到一个只存在于 call_competency 中的小子集。
未达到的能力应为假,记录适当数量的为真。来自能力 table 的完整列表。
我添加了派生的 table,不确定这是否正确,显然它 运行 不正确,不确定我做错了什么,我在浪费时间。非常感谢任何帮助。
SELECT comp.id, comp.shortname, comp.description,
CASE WHEN sum(CASE WHEN crs.grade = 'Pass' THEN 1 ELSE CASE WHEN crs.grade = 'Fail' THEN -1 ELSE 0 END END) >= comp_l.competency_break_level
THEN TRUE ELSE FALSE END
FROM competencies comp
INNER JOIN competency_levels comp_l ON comp_l.competency_group = comp.competency_group
LEFT OUTER JOIN (
SELECT competency_id
FROM call_competency
WHERE call_competency.user_id IN (
SELECT users.id FROM users WHERE email= _studentemail
)
) call_c ON call_c.competency_id = comp.id
LEFT OUTER JOIN competency_review_status crs ON crs.id = call_competency.review_status_id
GROUP BY comp.id, comp.shortname, comp.description, comp_l.competency_break_level
ORDER BY comp.id;
(偷拍,未安装测试)
看起来下面应该可以解决问题。您显然混淆了一些联接,其中有一个来自未引用的关系的列。此外,主查询中的 CASE
语句可以更简洁。
SELECT comp.id, comp.shortname, comp.description,
(sum(CASE WHEN crs.grade = 'Pass' THEN 1 WHEN crs.grade = 'Fail' THEN -1 ELSE 0 END) >= comp_l.competency_break_level) AS reached_limit
FROM competencies comp
JOIN competency_levels comp_l USING (competency_group)
LEFT JOIN (
SELECT competency_id, review_status_id
FROM call_competency
JOIN users ON id = user_id
WHERE email = _studentemail
) call_c ON call_c.competency_id = comp.id
LEFT JOIN competency_review_status crs ON crs.id = call_c.review_status_id
GROUP BY comp.id, comp.shortname, comp.description
ORDER BY comp.id;