SQL - 返回员工未完成的课程

时间:2017-03-15 16:16:28

标签: sql

我有3张桌子。

用户

EmpID | FirstName | Lastname 

Quiz_Grades

ID | QuizID | EmpID | Grade

测验

QuizID | Course | Name

我需要基本上找出哪些员工没有做过特定的测验以及该测验的测验ID是什么。

表几乎使用以下代码加入:

SELECT * 
FROM Users u
LEFT OUTER JOIN Quiz_Grades g ON u.EmpID = g.EmpID
LEFT OUTER JOIN Quiz q ON g.QuizID = q.QuizID

这将向我展示他们已经完成的所有用户和任何测验,我只需要知道哪些用户没有完成测验表中列出的任何测验,这是通过使用Quiz_Grades完成(这是显示他们已经完成的测验),并找出测验表中存在哪些测验,但该员工尚未完成这些测验。

请帮忙,因为这是我的头脑。

4 个答案:

答案 0 :(得分:1)

您需要$data[$thisId] = array( 'userId'=> $userId, 'username'=> $username, 'password'=> $password, ); $json = json_encode($data); Quiz的交叉加入。因此,每个测验都有每个Emploee。现在,您可以使用Users加入此结构,这些等级将为您提供一个表格,其中每个测验的所有员工都有一行但是用户没有等级的每个组合都会有{{1所以你在哪里声明必须是Left join

null

答案 1 :(得分:0)

这样做的一种方式是交叉连接,它将向每个用户显示每个测验,然后如果用户是否使用了该信息,则将左边连接到具有该信息的表。

select
     a.userud, a.quizid,
     case when qg.quizid is null then 'not done' else 'done' end as status
from (select distinct e.empid, q.quizid from users cross join quiz) a
     LEFT JOIN
     Quiz_Grades qg ON a.empid = qg.empid
                       and a.quizid = qg.quizid

答案 2 :(得分:0)

SELECT * FROM Users WHERE NOT (SELECT * FROM Quiz_Grades WHERE u.EmpID = g.EmpID
LEFT OUTER JOIN Quiz q ON g.QuizID = q.QuizID)

答案 3 :(得分:0)

试试这个:

SELECT * FROM Users u
CROSS JOIN Quiz q
WHERE NOT EXISTS (SELECT TOP 1 1 
                  FROM Quiz_Grades g 
                  WHERE u.EmpID = g.EmpID 
                  AND g.QuizID = q.QuizID)

基本上让所有测验都在没有每个用户成绩的地方