簡體   English   中英

SQL連接僅在所有行匹配時返回結果

[英]SQL join to return results only if all rows match

這是我第一次訪問該網站,請保持溫柔。 我試圖在這里找到答案,但是似乎沒有什么合適的選擇,並且在閱讀了不同類型的聯接之后,我仍然沒有一個明智的選擇。

我有以下表格:

employees (employee_id, name)
assessments (assessment_id, name, pass_score)
authorizations (authorization_id, name)

員工進行評估並登錄:

assessments_taken (assessment_taken_id, employee_id, assessment_id, score)

授權由以下各項提供的多個個人評估組成:

authorization_requirements (auth_req_id, authorization_id, assessment_id)

其中authorization_idassessment_id是唯一約束,以防止該對重復。

我嘗試設計的查詢類似於以下內容:

SELECT employees.name, authorization.name ...

我只想要回如雇員已通過所有評估中authorization_requirements考慮到員工的授權和授權。

誰能幫我找到我要查找的查詢/子查詢?

下圖可能會在某種程度上幫助您學習SQL連接-它甚至還為您提供了一些SQL本身! 至於authorization_requirements,這聽起來像您需要在聯接中使用一些WHERE子句。

希望對您有所幫助,如有任何澄清,請隨時提出!

SQL連接

看看這個http://sqlfiddle.com/#!2/ac7887/2

我認為此查詢將為您完成。 它依賴於每個員工每個評估進行的評估中只有一個條目。 如果員工可以多次進行評估,並且所有結果都記錄在此表中,那么還有第二個查詢對您有用。

SELECT
  Employees.name Employee,
  authorizations.name Authorization
FROM
  employees
  CROSS JOIN authorizations
  INNER JOIN authorization_requirements ON authorizations.authorization_id = authorization_requirements.authorization_id
  INNER JOIN assessments ON authorization_requirements.assessment_id = assessments.assessment_id
  LEFT JOIN assessments_taken ON employees.employee_id = assessments_taken.employee_id AND assessments.assessment_id = assessments_taken.assessment_id AND assessments.pass_score <= assessments_taken.score
GROUP BY
  Employees.name,
  authorizations.name
HAVING
  COUNT(assessments.assessment_id) = COUNT(assessments_taken.assessment_taken_id)

如果Assessments_taken中有多個條目:

SELECT
  Employees.name Employee,
  authorizations.name Authorization
FROM
  employees
  CROSS JOIN authorizations
  INNER JOIN authorization_requirements ON authorizations.authorization_id = authorization_requirements.authorization_id
  INNER JOIN assessments ON authorization_requirements.assessment_id = assessments.assessment_id
  LEFT JOIN (SELECT
               assessments_taken.employee_id,
               assessments_taken.assessment_id,
               MAX(Score) best_score
             FROM
               assessments_taken
             GROUP BY
               assessments_taken.employee_id,
               assessments_taken.assessment_id
             ) best_assessments_taken ON employees.employee_id = best_assessments_taken.employee_id AND assessments.assessment_id = best_assessments_taken.assessment_id AND assessments.pass_score <= best_assessments_taken.best_score
GROUP BY
  Employees.name,
  authorizations.name
HAVING
  COUNT(assessments.assessment_id) = COUNT(best_assessments_taken.assessment_id)

這些查詢獲得每位雇員和授權,然后確保該雇員在assesments_taken中獲得的條目超過了authorization_requirements中指定的每個評估所需的分數

如果不支持CROSS JOIN則可能需要將這兩個表放在子查詢中,然后更改CROSS JOIN條件以引用子查詢中的列:

SELECT
  employee_authorizations.employee_name Employee,
  employee_authorizations.authorization_name Authorization
FROM
  (SELECT
        employees.employee_id,
        employees.name employee_name,
        authorizations.authorization_id,
        authorizations.name authorization_name
  FROM
        employees,
        authorizations) employee_authorizations
  INNER JOIN authorization_requirements ON employee_authorizations.authorization_id = authorization_requirements.authorization_id
  INNER JOIN assessments ON authorization_requirements.assessment_id = assessments.assessment_id
  LEFT JOIN (SELECT
               assessments_taken.employee_id,
               assessments_taken.assessment_id,
               MAX(Score) best_score
             FROM
               assessments_taken
             GROUP BY
               assessments_taken.employee_id,
               assessments_taken.assessment_id
             ) best_assessments_taken ON employee_authorizations.employee_id = best_assessments_taken.employee_id AND assessments.assessment_id = best_assessments_taken.assessment_id AND assessments.pass_score <= best_assessments_taken.best_score
GROUP BY
  employee_authorizations.employee_name,
  employee_authorizations.authorization_name
HAVING
  COUNT(assessments.assessment_id) = COUNT(best_assessments_taken.assessment_id)

暫無
暫無

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

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