SQL-返回员工';谁没有';未完成课程

SQL-返回员工';谁没有';未完成课程,sql,Sql,我有三张桌子 用户 EmpID | FirstName | Lastname ID | QuizID | EmpID | Grade 测验成绩 EmpID | FirstName | Lastname ID | QuizID | EmpID | Grade 测验 QuizID | Course | Name 我需要基本上找出哪些员工没有做过特定的测验,以及该测验的测验ID是什么 这些表基本上是使用以下代码连接的: SELECT * FROM Users u LEFT OUTER

我有三张桌子

用户

EmpID | FirstName | Lastname 
ID | QuizID | EmpID | Grade
测验成绩

EmpID | FirstName | Lastname 
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
这将向我展示所有用户和他们做过的任何测验。显然,我只需要知道哪些用户没有做测验表中列出的任何测验,这是通过使用测验分数来完成的(这是显示他们做了什么测验的内容)并找出测验表中存在哪些测验,但该员工尚未完成


请提供任何帮助,因为这是在做我的头。

其中一种方法是交叉连接,它将向每个用户显示每个测验,然后左连接包含信息的表,如果用户做了或没有做

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

您需要交叉连接
测验
用户
。所以你的每一位员工都参加了每一次测验。现在,您可以使用
左连接将此结构连接到等级,这将得到一个表,其中每个参加测验的所有员工都有一行,但每个组合中,用户没有等级,但将有一个
null
,因此您的where语句必须类似于
where grade not null

Select  *
from    Users u
cross join quiz q
left outer join quiz_grades qg
on      u.EmpId = qg.EmpId and
        q.QuizID = qg.QuizID
where   qg.Grade is not null
试试这个:

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)

基本上,在没有每个用户评分的情况下获得所有测验

Legend-我需要更频繁地使用交叉连接@林奇你好,很高兴你喜欢。如果是你选择的答案,请考虑接受它(左上V图标)。欢迎来到!在编写代码时,请通过选择代码并单击编辑器顶部栏上的大括号来正确设置其格式。您使用的是哪种DBMS?博士后?神谕DB2?火鸟?