左连接不会 Return 为空值?
Left Join Won't Return Nulls?
我有一个查询和一个 Table。查询 "EmployeeTraining" 包括员工姓名、他们参加的培训课程、参加日期和到期时间。我希望 LeftJoin 到 return 的是所有可用的培训课程和每个员工缺少的课程,所以在本质上,任何空值。
"ApplicableTraining"中总共有 5 条记录。一些员工只参加了4/5的课程,在"EmployeeTraining"记录中只有4条记录。在 "datetaken" 和 "Expiry" 中不应该加入 return 该特定员工的第 5 个培训项目?
适用培训示例:
- WHMIS
- 急救
- 心肺复苏术
- 丙烷
- TDG
员工培训样本
- 萨姆 |管理信息系统 | 05/03/2011 |05/03/2012
- 萨姆 |急救 | 2010 年 6 月 9 日 | 2011 年 6 月 9 日
- 萨姆 |心肺复苏 | 2011 年 5 月 3 日 | 2012 年 5 月 3 日
- 萨姆 |丙烷 | 12/03/2015| 12/03/2018
期望的结果
- 萨姆 |管理信息系统 | 05/03/2011 |05/03/2012
- 萨姆 |急救 | 2010 年 6 月 9 日 | 2011 年 6 月 9 日
- 萨姆 |心肺复苏 | 2011 年 5 月 3 日 | 2012 年 5 月 3 日
- 萨姆 |丙烷 | 12/03/2015| 12/03/2018
- 萨姆 | TDG| |
这是通过 Access 上的设计视图生成的左联接,但它 return 根本没有任何空值。
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
如果那个查询returns没有空值,那么就没有空值
你可以通过添加WHERE EmployeeTraining.Training IS NULL
来测试
您缺少 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 NULL
尝试使用不同的存在性运算符进行健全性测试,例如
SELECT ApplicableTraining.AppTraining
FROM ApplicableTraining a
WHERE NOT EXISTS ( SELECT *
FROM EmployeeTraining a
WHERE a.AppTraining = e.Training );
如果这个returns什么都没有那么就没有缺失值。
您需要在 table:Employee 和 table:ApplicableTraining 之间进行 CROSS JOIN,然后再与 view:EmployeeTraining 进行 LEFT JOIN。
CROSS JOIN,将来自 table A 的所有记录与 table B 连接起来,无论它们的 tables 之间的连接如何。
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 | |
我有一个查询和一个 Table。查询 "EmployeeTraining" 包括员工姓名、他们参加的培训课程、参加日期和到期时间。我希望 LeftJoin 到 return 的是所有可用的培训课程和每个员工缺少的课程,所以在本质上,任何空值。
"ApplicableTraining"中总共有 5 条记录。一些员工只参加了4/5的课程,在"EmployeeTraining"记录中只有4条记录。在 "datetaken" 和 "Expiry" 中不应该加入 return 该特定员工的第 5 个培训项目?
适用培训示例:
- WHMIS
- 急救
- 心肺复苏术
- 丙烷
- TDG
员工培训样本
- 萨姆 |管理信息系统 | 05/03/2011 |05/03/2012
- 萨姆 |急救 | 2010 年 6 月 9 日 | 2011 年 6 月 9 日
- 萨姆 |心肺复苏 | 2011 年 5 月 3 日 | 2012 年 5 月 3 日
- 萨姆 |丙烷 | 12/03/2015| 12/03/2018
期望的结果
- 萨姆 |管理信息系统 | 05/03/2011 |05/03/2012
- 萨姆 |急救 | 2010 年 6 月 9 日 | 2011 年 6 月 9 日
- 萨姆 |心肺复苏 | 2011 年 5 月 3 日 | 2012 年 5 月 3 日
- 萨姆 |丙烷 | 12/03/2015| 12/03/2018
- 萨姆 | TDG| |
这是通过 Access 上的设计视图生成的左联接,但它 return 根本没有任何空值。
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
如果那个查询returns没有空值,那么就没有空值
你可以通过添加WHERE EmployeeTraining.Training IS NULL
您缺少 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 NULL
尝试使用不同的存在性运算符进行健全性测试,例如
SELECT ApplicableTraining.AppTraining
FROM ApplicableTraining a
WHERE NOT EXISTS ( SELECT *
FROM EmployeeTraining a
WHERE a.AppTraining = e.Training );
如果这个returns什么都没有那么就没有缺失值。
您需要在 table:Employee 和 table:ApplicableTraining 之间进行 CROSS JOIN,然后再与 view:EmployeeTraining 进行 LEFT JOIN。
CROSS JOIN,将来自 table A 的所有记录与 table B 连接起来,无论它们的 tables 之间的连接如何。
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 | |