1

複雑なクエリについて助けを求めてここに来ました。私はこれのために多くの異なることを試みましたが、私が望む結果が得られませんでした。私のスキーマの骨抜きバージョンは次のとおりです。問題の3つのテーブルは、Employeesテーブル、EmployeeTrainingテーブル、およびRequiredTrainingテーブルです。従業員テーブルには、empID、名前、住所、電子メール、positionWorkedなどの従業員の情報が保持されます。EmployeeTrainingテーブルには、empIDとTrainingNameが保持されます。RequiredTrainingテーブルには、PositionとTrainingNameがあります。

従業員:empID、名前、役職

EmployeeTraining:empIDtrainingName

requiredTraining: PositiontrainingName

さらに明確にするために、いくつかのサンプルデータを次に示します。

従業員

              *EMPID~~Name~~Position~~
                  1      Ted     Accountant

                  2      Bob     Janitor

従業員研修

                 **empID~~TrainingName**
                    1          Crunching Numbers

                    1          Microsoft Excel

                    1          Using an Abicus

                    2          Lemon Pledge 100

                    2          Scrubbing Toilets

必要なトレーニング

                  **position**~~**TrainingName**


                    Accountant    Crunching Numbers

                    Accountant    Microsoft Excel

                    Accountant    Using an Abicus

                    Accountant    TPS Reports

                    Janitor       Lemon Pledge 100

                    Janitor       Scrubbing Toilets

英語で、そして長期的には、フォームから従業員を選択し、その従業員から完了したすべてのトレーニングを示すサブフォームを作成したいと思います(SELECT * FROM Employees INNER JOIn EmployeeTraining on employees.empid = employeetraining.empID WHERE empID = me.empID)

また、現在の職務に必要な、従業員が完了していないトレーニングを示す別のサブフォームが必要です。これは私が苦労しているところです。私はMSAccessのクエリビルダーの使用に慣れていないか、慣れていませんが、「一致しないクエリを見つける」だけでなく、独自のクエリを作成しようとしました。これはMINUS演算が機能するように見えますが、MSAccessはMINUSをサポートしていません。上記のクエリからrequiredTrainingテーブルのクエリへのNOTINだけでなく、null述語を使用してLEFT JOINを試しましたが、探している結果が得られませんでした。

たとえば、このサンプルデータに対して書き込もうとしているクエリの結果は次のようになります。

従業員ID1の場合(会計士のテッド)

tedには「TPSレポート」トレーニングが必要です

従業員2(管理人のボブ)

ボブは自分のポジションのトレーニングをすべて完了しました。

私が試しているクエリの例は次のとおりです。

      SELECT employees.position,employeeTraining.empid,employeetraining.TrainingName          
      FROM EmployeeTraining 
      InNER JOIN Employees ON EmployeeTraining.empid = employees.empid
      WHERE empid = '1'
      LEFT JOIN
      SELECT TrainingName,Position FROM requiredTraining
      ON EmployeeTraining.Training = RequiredTraining.Training
      WHERE (((EmployeeTraining.Training is Null)))

編集:この質問は回答済みです。助けてくれてありがとう。あなたの質問は、それぞれが異なっていましたが、すべて目標を達成しました。

4

4 に答える 4

1

以下のクエリは、SQLをカットして派生テーブルに貼り付けた2つのMSAccessクエリから作成されています。2つのクエリは、現在のトレーニングを受けている従業員(#1)と必要なトレーニングを受けている従業員(#2)を選択します。更新はできませんが、簡単に作成できます。最後に行を追加することで、不足しているトレーニングのみを表示できます。

WHERE et.TrainingName Is Null

1人の従業員を選択するには、次の行を追加します。

WHERE rt.EMPID=1 AND et.TrainingName Is Null

ただし、サブフォームについて言及しているので、リンクの子フィールドとマスターフィールドを使用して従業員ごとに制限することをお勧めします。

SQL

SELECT rt.empid,
       rt.position,
       rt.trainingname,
       et.trainingname AS IsTrained
FROM   (SELECT employees.empid,
               requiredtraining.position,
               requiredtraining.trainingname
        FROM   employees
               INNER JOIN requiredtraining
                       ON employees.position = requiredtraining.position) AS rt
       LEFT JOIN (SELECT employees.empid,
                         employees.position,
                         employeetraining.trainingname
                  FROM   employees
                         INNER JOIN employeetraining
                                 ON employees.empid = employeetraining.empid) AS
                 et
              ON ( rt.trainingname = et.trainingname )
                 AND ( rt.position = et.position )
                 AND ( rt.empid = et.empid ); 
于 2012-06-19T14:35:05.280 に答える
1

次のクエリは、完了する必要のあるトレーニング名を持つすべての従業員を返す必要があります。

select e.emp_id, rt.TrainingName
from employees e left outer join
     RequiredTraining rt
     on e.position = rt.position
where rt.TrainingName not in (select TrainingName from EmployeeTraining et where et.empId = e.EmpId)

「from」句の結合は、必要なすべてのトレーニングを検索します。次に、「where」句は相関サブクエリを使用して、従業員が完了していないサブクエリを検索します。

于 2012-06-19T13:51:56.060 に答える
1

あなたは他のクエリと実際に非常に近いです...あなたはNOTIN句を試すかもしれません。たとえば、あなたが言ったように、あなたは次のように特定のトレーニングを完了したすべての従業員を得ることができます:

SELECT e.empID, e.name, e.Position, et.TrainingName
FROM Employees e
JOIN EmployeeTraining et ON e.empID = et.empID
WHERE empID = me.empID

今必要なのは、トレーニングを完了していないすべての従業員です...トレーニングの種類が作成済みのクエリに含まれていないことを確認して、trainingNameテーブルで結合を行うことができます。

SELECT e.empID, e.name, e.Position, rt.TrainingName
FROM Employees e
JOIN requiredTraining rt ON e.Position = rt.Position
WHERE rt.TrainingName NOT IN
(
   SELECT et.TrainingName
   FROM Employees e
   JOIN EmployeeTraining et ON e.empID = et.empID
   WHERE empID = me.empID
)
  AND e.empID = me.empID

上記のように、実際に従業員テーブルに参加する必要はありません...次を使用するだけでよいことに注意してください。

SELECT e.empID, e.name, e.Position, rt.TrainingName
FROM Employees e
JOIN requiredTraining rt ON e.Position = rt.Position
WHERE rt.TrainingName NOT IN
(
   SELECT et.TrainingName
   FROM EmployeeTraining
   WHERE et.empID = me.empID
)
  AND e.empID = me.empID
于 2012-06-19T14:09:04.030 に答える
1

次のクエリは、Access2007でテストされたサンプルデータに基づいてこの結果セットを返します。

EMPID Position    TrainingName
1     Accountant  TPS Reports

SELECT
    sub.EMPID,
    sub.Position,
    sub.TrainingName
FROM
    (
        SELECT
            e.EMPID,
            e.Position,
            rt.TrainingName
        FROM
            Employees AS e
            INNER JOIN RequiredTraining AS rt
            ON e.Position = rt.position
    ) AS sub
    LEFT JOIN EmployeeTraining AS et
    ON
            sub.TrainingName = et.TrainingName
        AND sub.EMPID = et.empID
WHERE et.TrainingName Is Null;
于 2012-06-19T15:03:03.730 に答える