[英]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_id
和assessment_id
是唯一約束,以防止該對重復。
我嘗試設計的查詢類似於以下內容:
SELECT employees.name, authorization.name ...
我只想要回如雇員已通過所有評估中authorization_requirements考慮到員工的授權和授權。
誰能幫我找到我要查找的查詢/子查詢?
下圖可能會在某種程度上幫助您學習SQL連接-它甚至還為您提供了一些SQL本身! 至於authorization_requirements,這聽起來像您需要在聯接中使用一些WHERE子句。
希望對您有所幫助,如有任何澄清,請隨時提出!
看看這個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.