SQL查询:列出一个表中不出现在另一个表中的所有项目
我正在研究一个培训跟踪器程序,而我正处于无法找出SQL查询的地步。SQL查询:列出一个表中不出现在另一个表中的所有项目
我有3个表格:employees, trainingRecords, masterList
。
employees
和trainingRecords
通过empID
fkey相关。
trainingRecords
和masterList
通过TID
fkey相关。
现在培训记录表是空白的,因为没有输入任何内容(所有员工都没有培训)。
我想用masterList中所有在trainingRecords
表中未下载的项目填充一个列表框。
由于trainingRecords
表是空白的,应在主列表中的所有条目返回从employees
表lName, fName
和docName, 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
你想要LEFT JOIN,在连接的左边是你知道将包含所有内容的表格,右边是你正在测试的内容。
select masterList.* from masterList LEFT JOIN trainingRecords ON(masterList.TID = trainingRecords.TID) WHERE trainingRecords.TID IS NULL;
我最终搞清楚了这一点,但我如何得到那里的员工名? – 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中的任何(未来)记录匹配的记录。
不知道发生了什么,但我得到一个错误,说明连接不被支持。别名? – Sinaesthetic 2010-10-29 04:17:07
为什么不使用全部加入?我使用的是:
Select A.* from A Full Join B on A.ID = B.ID where B.ID is NULL
只是意识到完全连接与本例中的左连接具有相同的结果。 – 2014-03-06 02:56:27
这个工作起初,但后来我添加了一条记录,现在它返回的空表 – Sinaesthetic 2010-10-29 04:42:39
改变了where子句,并增加了另一列到b部分。这应该现在正常工作:) – JumpingJezza 2010-10-29 04:53:47
booya那里。我甚至可以把它从内存中分离出来,谢谢。 – Sinaesthetic 2010-10-29 18:29:34