2013-04-30 4 views
3

Я понимаю, что, наверное, не имеет смысла, так что позвольте мне попытаться объяснить: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 

Спасибо за помощь!

+0

Что бы ваше желаемый результат служащего? Какие столбцы и какие? Строка 'positID',' empID', 'trainID' для каждого обучения сотрудника отсутствует, чтобы получить позицию? –

+0

Конечным результатом будет список: имя сотрудника, название должности, название отсутствующего обучения (ов). Учитывая текущую структуру БД, мне нужно будет сделать несколько объединений, что хорошо, я уже знаком с этим уже по большей части, просто не могу получить этот решающий шаг. Благодарю. –

+0

Какие RDBMS и версия вы используете ?. Кроме того, когда вы говорите о «отсутствующих тренингах», вам нужно понять, что они действительны для определенной позиции, или вы хотите иметь недостающую подготовку для сотрудника на всех должностях ?. Что произойдет, если у сотрудника есть несколько пропущенных тренингов, вам нужны две или несколько строк? – Lamak

ответ

3

Я думаю, что это будет работать:

SELECT 
    positID, trainID 
FROM 
    positTraining 
WHERE 
    positID = X 
    AND trainID not in (
     SELECT trainID FROM empTraining WHERE empID = A) 

Рассматривая X как positionId вы ищете

+0

На самом деле это приблизилось к тому, что мне было нужно, поэтому я отметил это как правильный ответ. Благодаря! –

Смежные вопросы

 Смежные вопросы