2010-10-29 51 views
5

我正在研究一個培訓跟蹤器程序,而我正處於無法找出SQL查詢的地步。SQL查詢:列出一個表中不出現在另一個表中的所有項目

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

employeestrainingRecords通過empID fkey相關。

trainingRecordsmasterList通過TID fkey相關。

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

我想用masterList中所有在trainingRecords表中未下載的項目填充一個列表框。

由於trainingRecords表是空白的,應在主列表中的所有條目返回從employeeslName, fNamedocName, docNumber

我很難過。有什麼建議麼?

回答

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

3

你想要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

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是爲了確保所有來自員工的記錄都顯示出來,即使訓練記錄中沒有匹配(由於訓練記錄根本沒有數據,這當然不存在)。

然後,您將查詢的結果和RIGHT OUTER連接到masterList。 RIGHT OUTER保證即使訓練記錄中沒有匹配,也會包含所有masterList記錄。

最後,WHERE TR.TID IS NULL過濾掉任何與trainingRecords中的任何(未來)記錄匹配的記錄。

+0

不知道發生了什麼,但我得到一個錯誤,說明連接不被支持。別名? – Sinaesthetic 2010-10-29 04:17:07

-1

爲什麼不使用全部加入?我使用的是:

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

只是意識到完全連接與本例中的左連接具有相同的結果。 – 2014-03-06 02:56:27

相關問題