我正在开发一个培训跟踪器程序,我正处于无法弄清SQL查询的地步。
我有3张桌子:employees, trainingRecords, masterList
。
employees
和trainingRecords
通过empID
fkey相关联。
trainingRecords
和masterList
通过TID
fkey相关联。
现在,培训记录表是空白的,因为没有输入任何内容(所有员工都没有接受过培训)。
我想填充一个列表框,其中包含masterList中所有未在trainingRecords
表中指定的项目。
由于trainingRecords
表为空,因此应该从lName, fName
表返回employees
,并为主列表中的所有条目返回docName, docNumber
。
我很难过。有什么建议吗?
答案 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