[英]SQL query: list all items in one table that do not appear in another table
我正在研究一個培訓跟蹤器程序,我正處於無法弄清SQL查詢的地步。
我有3個表: employees, trainingRecords, masterList
。
employees
和trainingRecords
通過empID
fkey相關。
trainingRecords
和masterList
通過TID
fkey相關聯。
現在,培訓記錄表是空白的,因為沒有輸入任何內容(所有員工都沒有接受過培訓)。
我想填充一個列表框,其中包含masterList中所有在trainingRecords
表中未列出的項目。
由於trainingRecords
表是空白的,它應該返回lName, fName
從employees
表和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;
好的,您必須在中間使用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 JOIN。 LEFT OUTER是為了確保員工的所有記錄都顯示,即使在trainingRecords中沒有匹配(由於trainingRecords完全沒有數據,因此當然不存在)。
然后,您將獲取該查詢的結果並將其直接加入到masterList中。 RIGHT OUTER保證即使trainingRecords中沒有匹配項,也會包含所有masterList記錄。
最后,WHERE TR.TID IS NULL過濾掉實際匹配trainingRecords中任何(未來)記錄的任何記錄。
為什么不使用Full Join? 我用的是:
Select A.* from A Full Join B on A.ID = B.ID where B.ID is NULL
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.