簡體   English   中英

連接派生表postgres

[英]Joining a derived table postgres

我有4張桌子:

  • 能力:明顯的能力列表,靜態列表和庫
  • 能力水平:指一組相關的能力,並且具有我正在測試的許多能力
  • call_competency:記錄了指定能力的所有“呼叫”的列表
  • skillncy_review_status:證明是否對每個call_competency都進行了審核

現在,我正在嘗試編寫此查詢以計算總數,並吐出能力,id和用戶是否已達到限制。 一切正常,除了我添加用戶時。 我不確定自己在做什么錯,一旦我在where子句中限制了用戶的呼叫能力,我就會得到一個很小的子集,該子集僅存在於我想要整個能力列表時返回的call_competency中。

沒有達到的能力應該是錯誤的,記錄的正確數字應該是正確的。 能力表中的完整列表。

我添加了派生表,不確定這是否正確,顯然它不能正常運行,不確定我在做什么錯,我在浪費時間。 任何幫助,不勝感激。

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;

暫無
暫無

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

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