我有一个查询和一个表。查询"EmployeeTraining“包括员工姓名、他们参加的培训课程、参加日期和到期日期。我希望LeftJoin返回的是所有可用的培训课程和每个员工缺少的课程,因此在本质上,所有的培训课程都是无效的。
在"ApplicableTraining“中总共有5条记录。有些员工只选修了4/5的课程,在"EmployeeTraining“记录中只有4条记录。在“日期”和“到期”中,left不应该返回该特定员工的第5项培训项目吗?
适用培训样本:
样本EmployeeTraining
期望的结果
这是通过Access的Design生成的左联接,但它根本不返回任何空值。
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
发布于 2016-09-30 13:01:33
您需要在表:Employee和table之间进行交叉连接:左联接后的ApplicableTraining:EmployeeTraining。
交叉连接,将表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 | |发布于 2016-09-30 12:45:53
如果该查询不返回空,则不存在空。
可以通过添加WHERE EmployeeTraining.Training IS NULL进行测试
发布于 2016-09-30 12:50:12
您缺少为表提供别名的where condition.Try。
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 NULLhttps://stackoverflow.com/questions/39791826
复制相似问题