4

おそらく意味をなさないので、説明してみましょう。

次の列を持つ2つのテーブルがあります(関連するもののみ):

positTraining (positID, trainID)
empTraining (empID, trainID)

テーブルには、ポジションに必要なpositTrainingリストが含まれています。position idstraining ids

テーブルには、従業員が完了した現在のempTrainingリストが含まれています。employee idstraining ids

training ids従業員がまだ完了していないポジションで必要なものだけを選択したい。

したがって、従業員 A がトレーニング 1 と 3 を完了したが、ポジション X がトレーニング 1 と 2 を必要とするtrainID場合、不足しているトレーニング (2) に対して を選択します。

それが理にかなっていることを願っています。

私は何百万もの異なる方法でグーグルを検索し、ここでもSOをチェックしましたが、この追加の要件のために有効な答えを見つけることができません:

trainIDsに基づいて のみを選択したいempID。この背後にある理由empID=2は、正しい一致がemp=1あるかもしれないが、そうでないかもしれないという事実によるものです。

私が午後に最も近いのは、次を使用することです。

select positID, trainID
from positTraining
except
select empID, trainID
from empTraining

どちらが返されますか:

positID  |  trainID
1        |  2

これは正しいですが、現在の記録のためだけです。別の従業員が正しい一致でデータベースに配置されるとすぐに、これは機能しなくなります。

私はいくつかの異なる方法を使用してみました:

JOINS
NOT IN
NOT EXIST

これは私が作っているよりもずっと簡単だと確信していますが、それを理解することはできません.

ご協力いただきありがとうございます。詳細があれば喜んで追加させていただきます。お知らせください。

EDIT 1
SQL Server 2012 Express を使用しています

編集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

助けてくれてありがとう!

4

1 に答える 1