Запрос SQL: перечислите все элементы в одной таблице, которые не отображаются в другой таблице - PullRequest
6 голосов
/ 29 октября 2010

Я работаю над программой для отслеживания тренировок и сейчас не могу понять запрос SQL.

У меня есть 3 таблицы: employees, trainingRecords, masterList.

employees и trainingRecords связаны через клавишу empID.

trainingRecords и masterList связаны через клавишу TID.

В настоящий момент таблица записей об обучении пуста, потому что ничего не было введено (все сотрудники не имеют обучения).

Я хочу заполнить список всеми элементами в masterList, которые не учтены в таблице trainingRecords.

Поскольку таблица trainingRecords пуста, она должна возвращать lName, fName из таблицы employees и docName, docNumber для всех записей в основном списке.

Я в тупике. Есть предложения?

Ответы [ 4 ]

6 голосов
/ 29 октября 2010

Я предполагаю, что вы хотите отобразить всех сотрудников несколько раз с учебными документами, которые они еще не сделали.

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
3 голосов
/ 29 октября 2010

Вы хотите ЛЕВОЕ СОЕДИНЕНИЕ, с левой стороны объединения будет таблица, в которой, как вы знаете, будет все, а справа будет то, с чем вы тестируете.

select masterList.* from masterList LEFT JOIN trainingRecords ON(masterList.TID = trainingRecords.TID) WHERE trainingRecords.TID IS NULL; 
0 голосов
/ 06 марта 2014

Почему бы не использовать Full Join?Я использую:

Select A.* from A Full Join B on A.ID = B.ID where B.ID is NULL
0 голосов
/ 29 октября 2010

Хорошо, вам нужно СОЕДИНИТЬ все три таблицы с таблицей 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

Что здесь происходит?

Во-первых, вы делаете ЛЕВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ сотрудников и trainingRecords.LEFT OUTER - убедиться, что все записи сотрудников отображаются, даже если нет совпадений в trainingRecords (которых, конечно, не существует, так как trainingRecords вообще не имеет данных).

Затем вы принимаетерезультаты этого запроса и ПРАВО НАРУЖНОЕ СОЕДИНЕНИЕ их к masterList.RIGHT OUTER гарантирует, что все записи masterList будут включены, даже если нет совпадений в trainingRecords.

Наконец, WHERE TR.TID IS NULL отфильтровывает любые записи, которые фактически соответствуют любым (будущим) записям в trainingRecords.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...