SQL查询:列出一个表中未出现在另一个表中的所有项

时间:2010-10-29 03:13:49

标签: sql join

我正在开发一个培训跟踪器程序,我正处于无法弄清SQL查询的地步。

我有3张桌子:employees, trainingRecords, masterList

employeestrainingRecords通过empID fkey相关联。

trainingRecordsmasterList通过TID fkey相关联。

现在,培训记录表是空白的,因为没有输入任何内容(所有员工都没有接受过培训)。

我想填充一个列表框,其中包含masterList中所有未在trainingRecords表中指定的项目。

由于trainingRecords表为空,因此应该从lName, fName表返回employees,并为主列表中的所有条目返回docName, docNumber

我很难过。有什么建议吗?

4 个答案:

答案 0 :(得分:5)

我假设您希望多次向所有员工展示他们尚未完成的培训文档。

SELECT a.lName, a.fName, b.docNumber, b.docName 
FROM
(SELECT e.lName, e.fName, t.TID 
 FROM employees e
 LEFT JOIN trainingRecords t ON e.empID = t.empID
) AS a,
(SELECT m.docNumber, m.docName, t.TID
 FROM masterList m
 LEFT JOIN trainingRecords t ON m.TID = t.TID
) AS b
WHERE a.TID IS NULL OR b.TID IS NULL
ORDER BY a.lName, b.docNumber

示例结果:

lName     fName  docNumber          docName
Simpson   Homer     1      Nuclear Physics for Dummies
Simpson   Homer     2      Nuclear Physics for Beginners
Simpson   Homer     3      Advanced Nuclear Physics
Simpson   Lisa      3      Advanced Nuclear Physics

答案 1 :(得分:3)

你想要LEFT JOIN,在连接的左侧将是你知道将包含所有内容的表,右边将是你正在测试的内容。

select masterList.* from masterList LEFT JOIN trainingRecords ON(masterList.TID = trainingRecords.TID) WHERE trainingRecords.TID IS NULL; 

答案 2 :(得分:0)

好的,您必须在中间使用trainingRecords表加入所有三个表,因为它具有链接其他两个表所需的列。您的查询将如下所示:

 SELECT E.lName, E.fName, ML.docName, ML.docNumber FROM
   (employees E LEFT OUTER JOIN trainingRecords TR ON E.empID = TR.empID)
                RIGHT OUTER JOIN masterList ML ON ML.TID = TR.TID
   WHERE TR.TID IS NULL

这里发生了什么?

首先,您正在进行员工和培训记录的左外联接。 LEFT OUTER是为了确保员工的所有记录都显示出来,即使trainingRecords中没有匹配项(由于trainingRecords完全没有数据,因此当然不存在)。

然后,您将获取该查询的结果并将其直接加入masterList。 RIGHT OUTER保证即使trainingRecords中没有匹配项,也会包含所有masterList记录。

最后,WHERE TR.TID IS NULL过滤掉实际匹配trainingRecords中任何(未来)记录的任何记录。

答案 3 :(得分:-1)

为什么不使用Full Join?我用的是:

Select A.* from A Full Join B on A.ID = B.ID where B.ID is NULL