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

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

问题描述:

我正在研究一个培训跟踪器程序,而我正处于无法找出SQL查询的地步。SQL查询:列出一个表中不出现在另一个表中的所有项目

我有3个表格:employees, trainingRecords, masterList

employeestrainingRecords通过empID fkey相关。

trainingRecordsmasterList通过TID fkey相关。

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

我想用masterList中所有在trainingRecords表中未下载的项目填充一个列表框。

由于trainingRecords表是空白的,应在主列表中的所有条目返回从employeeslName, fNamedocName, docNumber

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

我假设你想多次展示他们还没有完成的培训文件的所有员工。

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 
+0

这个工作起初,但后来我添加了一条记录,现在它返回的空表 – Sinaesthetic 2010-10-29 04:42:39

+0

改变了where子句,并增加了另一列到b部分。这应该现在正常工作:) – JumpingJezza 2010-10-29 04:53:47

+0

booya那里。我甚至可以把它从内存中分离出来,谢谢。 – Sinaesthetic 2010-10-29 18:29:34

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

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

我最终搞清楚了这一点,但我如何得到那里的员工名? – Sinaesthetic 2010-10-29 03:35:28

好吧,你必须加入在中间与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是为了确保所有来自员工的记录都显示出来,即使训练记录中没有匹配(由于训练记录根本没有数据,这当然不存在)。

然后,您将查询的结果和RIGHT OUTER连接到masterList。 RIGHT OUTER保证即使训练记录中没有匹配,也会包含所有masterList记录。

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

+0

不知道发生了什么,但我得到一个错误,说明连接不被支持。别名? – Sinaesthetic 2010-10-29 04:17:07

为什么不使用全部加入?我使用的是:

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

只是意识到完全连接与本例中的左连接具有相同的结果。 – 2014-03-06 02:56:27