2014-09-22 52 views
1

这是我第一次在网站上,所以请温和。我试图在这里找到我的答案,但似乎没有什么适合该法案,并阅读了不同类型的联接后,我仍然不明智。只有当所有行匹配时,SQL连接才返回结果

我有以下表:

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考虑到员工的授权和授权。

任何人都可以帮我找到我正在查询的查询/子查询吗?

+1

您正在使用哪个分档 – 2014-09-22 11:53:41

+1

OP没有在标签中指定mysql? – 2014-09-22 11:56:25

+1

@MrCoder,他们也指定mssql。 – 2014-09-22 11:58:48

回答

0

看一看这个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) 

这些查询让每一个员工和授权,然后确保该雇员已经得到了在assessments_taken超过所需的分数在authorization_requirements指定的每个评估的条目

如果不支持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) 
+0

哇,谢谢!这正是我所期待的。 – 2014-09-22 14:24:58

+0

因为不喜欢CROSS JOIN,需要进行哪些修改才能使其与MSAccess一起使用? – 2014-09-22 14:38:01

+0

@ MatthewO'Sullivan如果不支持CROSS JOIN,我已经更新了一个备用版本 – Tobsey 2014-09-22 15:09:59

4

下面的图片可能会帮助你学习SQL连接 - 它甚至会给你一些SQL本身!至于authorization_requirements这听起来像你需要在连接中使用一些WHERE子句。

希望这可以帮助,任何澄清,请随时问!

Sql Join

相关问题