Я понимаю, что, наверное, не имеет смысла, так что позвольте мне попытаться объяснить:SELECT Значения в одной таблице, которые не соответствуют другой таблице, но также ссылаются на другой столбец?
У меня есть две таблицы с Подписок столбцов (только релевантные из них):
positTraining (positID, trainID)
empTraining (empID, trainID)
Таблица positTraining
содержит перечень position ids
вместе с любым training ids
необходимо местоположение.
Таблица empTraining
содержит список employee ids
наряду с любым текущим training ids
работник компании.
Я хочу выбрать только training ids
, требуемый положением, что работник еще не заполнил.
Так что, если служащий завершило обучение 1 & 3, но Позиция X требует подготовке 1 & 2, я хочу, чтобы выбрать trainID
отсутствующее обучение (2).
Надеюсь, это имеет смысл.
Я искал Google миллиона различные способов и проверил здесь на SO, как хорошо, но не могу найти рабочий ответ в связи с этим дополнительным требованием:
Я хочу только выбрать trainIDs
на основе empID
. Рассуждение за этим связано с тем, что empID=2
может иметь правильное совпадение, но emp=1
не может.
Ближайший я получил весь день это с помощью следующих действий:
select positID, trainID
from positTraining
except
select empID, trainID
from empTraining
Который возвращает:
positID | trainID
1 | 2
Это правильно, но только из-за текущих записей. Как только другой сотрудник будет помещен в базу данных с правильным совпадением, это перестанет работать.
Я попытался с помощью нескольких различных методов:
JOINS
НЕ
НЕ СУЩЕСТВУЕТ
Я уверен, что это намного легче, чем я делаю это, но я просто не могу понять вне.
Спасибо за любую помощь, я буду рад добавить дополнительные данные, просто дайте мне знать.
EDIT 1
Я использую SQL Server 2012 Express,
EDIT 2
Это то, что я закончил с, я думаю, что это будет работать:
SELECT
pt.trainID AS positTrainID,
et.trainID AS empTrainID,
e.empFirst + ' ' + e.empLast AS empName
FROM
positTraining pt,
empTraining et,
emps e
WHERE
pt.positID = 1 AND
e.empID = 1 AND
pt.trainID not in (
SELECT et.trainID FROM empTraining et WHERE et.empID = 1)
AND pt.trainID = et.trainID
Результат:
positTrainID empTrainID empName
2 2 Emp1
Спасибо за помощь!
Что бы ваше желаемый результат служащего? Какие столбцы и какие? Строка 'positID',' empID', 'trainID' для каждого обучения сотрудника отсутствует, чтобы получить позицию? –
Конечным результатом будет список: имя сотрудника, название должности, название отсутствующего обучения (ов). Учитывая текущую структуру БД, мне нужно будет сделать несколько объединений, что хорошо, я уже знаком с этим уже по большей части, просто не могу получить этот решающий шаг. Благодарю. –
Какие RDBMS и версия вы используете ?. Кроме того, когда вы говорите о «отсутствующих тренингах», вам нужно понять, что они действительны для определенной позиции, или вы хотите иметь недостающую подготовку для сотрудника на всех должностях ?. Что произойдет, если у сотрудника есть несколько пропущенных тренингов, вам нужны две или несколько строк? – Lamak