查找两个表之间的数据子集的数据?

时间:2016-12-13 21:18:19

标签: sql sql-server

我使用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

但我需要完成那些部分完成的研究。而且我知道它正盯着我,但似乎无法正确地思考它。

1 个答案:

答案 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;