2016-09-30 77 views
0

我有一個查詢和表。查詢「員工培訓」包括員工姓名,培訓課程,日期和到期日期。我想要LeftJoin返回的是所有可用的培訓課程以及每個員工缺少的課程,所以在本質上,任何空值。左連接不會返回空?

「適用培訓」共有5條記錄。一些員工只參加了4/5課程,並且在「員工培訓」記錄中只有4條記錄。不應該離開加入返回該「特定員工」的第5個培訓項目,並在「datetaken」和「到期」中填入空值?

樣品適用培訓:

  • WHMIS
  • 急救
  • CPR
  • 丙烷
  • TDG

樣品EmployeeTraining

  • Sam | WHMIS | 05/03/2011 | 05/03/2012
  • Sam |第一個AID | 06/09/2010 | 06/09/2011
  • Sam | CPR | 05/03/2011 | 05/03/2012
  • Sam |丙烷| 2015年12月3日| 2018年12月3日

預期的效果

  • 山姆| WHMIS | 05/03/2011 | 05/03/2012
  • Sam |第一個AID | 06/09/2010 | 06/09/2011
  • Sam | CPR | 05/03/2011 | 05/03/2012
  • Sam |丙烷| 2015年12月3日| 12/03/2018
  • Sam | TDG | |

這是通過Access上的Design View生成的左連接,但它根本不返回任何空值。

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

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

我上載這裏https://drive.google.com/open?id=0B7foIFlbSH78cFpJOHFsYkxiUlU

+0

添加一些示例表數據和預期結果。 – jarlh

+0

顯然沒有任何員工沒有課程。 – jarlh

+0

一些員工已經參加了4/5次培訓課程,並且在查詢中有4條記錄。不應該離開加入返回第5次培訓課程,在「DateTaken」和到期的空值? – Macellaria

回答

1

您需要在表格之間進行CROSS JOIN:員工和表格:在LEFT JOIN和View: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/zh-cn/article/Join-tables-and-queries-3f5838bd-24a0-4832-9bc1-07061a1478f6#bmcross – Rit

2

我的數據庫如果查詢沒有返回空值,那麼有沒有空

您可以測試加入WHERE EmployeeTraining.Training IS NULL

+2

我會留下這個評論,但是我同意這一點。 –

+0

我更新了一些示例數據,我相信我在這裏做錯了什麼。 – Macellaria

0

你缺少WHERE條件。嘗試爲表格提供別名。

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); 

如果這不返回任何值,那麼沒有缺失值。