我使用MS SQL,并且有一个表A,其中包含一个研究ID列表,以及一个与研究相关的用户ID列表。因此,对用户进行研究是一对多的。
我有一个表B,其中列出了研究ID,以及已完成这些研究培训的用户ID列表。
并非表B中的每个人都在表A中。 表B中的一些课程有一部分用户已完成培训,有些课程没有人接受任何培训。
对于部分完成的课程,如何找出哪些用户缺少培训/没有培训记录?
<小时/> 表A(研究): StudyId,UserId
表B(培训): StudyId,UserId,TrainingDate
<小时/> 示例数据:
表A:
研究ID:1 ::::: UserId:1
研究ID:1 ::::: UserId:2
研究ID:1 ::::: UserId:3
研究ID:2 ::::: UserId:1
研究ID:2 ::::: UserId:2
研究ID:3 ::::: UserId:2
研究ID:3 ::::: UserId:3
表B:
研究ID:1 ::::: UserId:1 ::::: TrainingDate:01-01-2016
研究ID:1 ::::: UserId:3 ::::: TrainingDate:02-01-2015
研究ID:3 ::::: UserId:3 ::::: TrainingDate:02-04-2016
预期输出
根据上面的数据,研究2是唯一没有任何认证的研究(我已经弄明白了如何获得)。我需要的是部分完成的研究,并找出这些研究中缺少的人。
所以我的预期数据集是:
研究ID:1 ::::: UserId:2
研究ID:3 ::::: UserId:2
<小时/> 如上所述,我已经弄清楚如何在没有培训日期的情况下获得用户/学习,为此我使用了以下内容:
SELECT *
FROM TableA WHERE StudyId IN(SELECT A.StudyId
FROM TableA A
LEFT JOIN TableB B
ON B.StudyId = A.StudyId
WHERE B.StudyId IS NULL)
ORDER BY StudyId
但我需要完成那些部分完成的研究。而且我知道它正盯着我,但似乎无法正确地思考它。
答案 0 :(得分:0)
查询选择两个表中不存在的记录。因此,我们可以确定哪些培训没有指定日期,哪些培训有逃学。
select
a.StudyId,
a.UserId,
(
select top 1 1 from TableB
where StudyId = a.StudyId and TrainingDate < CURRENT_TIMESTAMP
) as 'Training was assigned' -- You may find this useful for additional analysis
from TableA as a
left outer join TableB as b
on a.StudyId = b.StudyId and a.UserId = b.UserId
where b.StudyId is null;