簡體   English   中英

SQL查詢:列出一個表中未出現在另一個表中的所有項

[英]SQL query: list all items in one table that do not appear in another table

我正在研究一個培訓跟蹤器程序,我正處於無法弄清SQL查詢的地步。

我有3個表: employees, trainingRecords, masterList

employeestrainingRecords通過empID fkey相關。

trainingRecordsmasterList通過TID fkey相關聯。

現在,培訓記錄表是空白的,因為沒有輸入任何內容(所有員工都沒有接受過培訓)。

我想填充一個列表框,其中包含masterList中所有在trainingRecords表中未列出的項目。

由於trainingRecords表是空白的,它應該返回lName, fNameemployees表和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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM