2016-09-30 9 views
0

私はクエリとテーブルを持っています。クエリ「EmployeeTraining」には、従業員の名前と、取得したトレーニングコース、取得日、有効期限が含まれます。私がLeftJoinに返すことを望むのは、利用可能なすべてのトレーニングコースと、各従業員が欠席しているコースです。左結合はNULLを返さないでしょうか?

「ApplicableTraining」に合計5つのレコードがあります。一部の従業員はコースの4/5だけを奪っており、「EmployeeTraining」レコードには4つのレコードしかありません。 「datetaken」と「Expiry」にヌルを持つその特定の従業員の5番目のトレーニング項目を戻す必要はありませんか?

サンプル適用トレーニング:

  • WHMIS
  • 応急
  • CPR
  • プロパン
  • TDG

EmployeeTrainingサンプル

  • サム| WHMIS | 05/03/2011 | 05/03/2012
  • サム|最初のAID | 06/09/2010 | 06/09/2011
  • サム| CPR | 05/03/2011 | 05/03/2012
  • サム|プロパン| 12/03/2015 | 2018年12月3日

望ましい結果

  • サム| WHMIS | 05/03/2011 | 05/03/2012
  • サム|最初のAID | 06/09/2010 | 06/09/2011
  • サム| CPR | 05/03/2011 | 05/03/2012
  • サム|プロパン| 12/03/2015 | 12/03/2018
  • サム| TDG | |

これは、Accessのデザインビューから生成された左結合ですが、すべてのNULLを返しません。そのクエリにNULLを返さない場合、私はここにhttps://drive.google.com/open?id=0B7foIFlbSH78cFpJOHFsYkxiUlU

+0

サンプルテーブルのデータと予想される結果を追加します。 – jarlh

+0

明らかに従業員のいないコースはありません。 – jarlh

+0

一部の従業員は4/5トレーニングコースを受講し、クエリに4つのレコードを持っています。参加してはいけないのは、 "DateTaken"とExpiryにヌルがある、5回目のトレーニングコースを返しますか? – Macellaria

答えて

1

テーブル間でCROSS JOINを実行する必要があります。従業員とテーブル:LEFT JOINビューの後のApplicableTraining:EmployeeTraining。

CROSS JOINでは、テーブル間の接続に関係なく、テーブルAのすべてのレコードをテーブルBと結合します。

Sample Applicable Training: 

WHMIS 
First Aid 
CPR 
Propane 
TDG 

Sample Employee 

SAM 

Result: 
SELECT ApplicableTraining.AppTraining, Table[Employee].Employee 
FROM ApplicableTraining 
CROSS JOIN Table[Employee] 

WHMIS|SAM 
First Aid|SAM 
CPR|SAM 
Propane|SAM 
TDG|SAM 

Desired Results 

SELECT Table[Employee].Employee, 
     ApplicableTraining.AppTraining, 
     EmployeeTraining.DateTaken, 
     EmployeeTraining.Expiry 
FROM ApplicableTraining 
CROSS JOIN Table[Employee] 
LEFT JOIN EmployeeTraining ON ApplicableTraining.AppTraining = EmployeeTraining.Training and EmployeeTraining.Employee = Table[Employee]."EmployeeID" 

Sam | WHMIS | 05/03/2011 |05/03/2012 
Sam | First AID | 06/09/2010 | 06/09/2011 
Sam | CPR | 05/03/2011 | 05/03/2012 
Sam | Propane | 12/03/2015| 12/03/2018 
Sam | TDG | | 
+0

クロス結合は外部結合と同じですか?クロスジョインを認識したくないようです。外部結合を認識しているようですが、依然として目的の結果が得られません。 – Macellaria

+0

答えを更新します。詳細はhttps://support.office.com/en-us/article/Join-tables-and-queries-3f5838bd-24a0-4832-9bc1-07061a1478f6#bmcrossを参照してください。 – Rit

2

を自分のデータベースをアップロードし

SELECT ApplicableTraining.AppTraining, 
EmployeeTraining.Employee, 
EmployeeTraining.DateTaken, 
EmployeeTraining.Expiry 

FROM ApplicableTraining LEFT JOIN EmployeeTraining ON ApplicableTraining.AppTraining = EmployeeTraining.Training; 

、その後、何のヌル

は、あなたがどこ条件が欠落しているWHERE EmployeeTraining.Training IS NULL

+2

私はこれをコメントとして残していただろうが、はい私はこれに同意する。 –

+0

サンプルデータを更新しましたが、ここで何か間違っていると思います。 – Macellaria

0

を追加することでテストすることができますはありません。テーブルのエイリアスを付けてみてください。

SELECT at.AppTraining, 
     et.Employee, 
     et.DateTaken, 
     et.Expiry 
FROM ApplicableTraining at 
    LEFT JOIN EmployeeTraining et ON at.AppTraining = et.Training 
WHERE et.Training IS NULL 
0

異なる実在の演算子を使用して健全性テストを試してください。

SELECT ApplicableTraining.AppTraining 
    FROM ApplicableTraining a 
WHERE NOT EXISTS (SELECT * 
         FROM EmployeeTraining a 
        WHERE a.AppTraining = e.Training); 

これが何も返されない場合、欠損値はありません。

関連する問題