Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 左联元';不返回空值?_Sql_Ms Access_Left Join - Fatal编程技术网

Sql 左联元';不返回空值?

Sql 左联元';不返回空值?,sql,ms-access,left-join,Sql,Ms Access,Left Join,我有一个查询和一个表。查询“EmployeeTraining”包括员工姓名、参加的培训课程、参加的日期和有效期。我希望LeftJoin返回的是所有可用的培训课程和每个员工缺少的课程,因此在essense中,任何空值 “应用培训”中共有5条记录。一些员工只参加了4/5的课程,在“员工培训”记录中只有4项记录。left join是否应该返回该特定员工的第五个培训项目,并且“DateTake”和“Expiry”中的值为空 适用培训样本: WHMIS 急救 心肺复苏 丙烷 TDG 雇员培训样本 S

我有一个查询和一个表。查询“EmployeeTraining”包括员工姓名、参加的培训课程、参加的日期和有效期。我希望LeftJoin返回的是所有可用的培训课程和每个员工缺少的课程,因此在essense中,任何空值

“应用培训”中共有5条记录。一些员工只参加了4/5的课程,在“员工培训”记录中只有4项记录。left join是否应该返回该特定员工的第五个培训项目,并且“DateTake”和“Expiry”中的值为空

适用培训样本:

  • WHMIS
  • 急救
  • 心肺复苏
  • 丙烷
  • TDG
雇员培训样本

  • Sam | WHMIS | 2011年3月5日| 2012年3月5日
  • Sam |急救| 2010年9月6日| 2011年9月6日
  • Sam | CPR | 2011年3月5日| 2012年3月5日
  • Sam |丙烷| 2015年3月12日| 2018年3月12日
预期结果

  • Sam | WHMIS | 2011年3月5日| 2012年3月5日
  • Sam |急救| 2010年9月6日| 2011年9月6日
  • Sam | CPR | 2011年3月5日| 2012年3月5日
  • Sam |丙烷| 2015年3月12日| 2018年3月12日
  • Sam | TDG ||
这是通过Access上的设计视图生成的左连接,但它根本不返回任何空值

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

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

我在这里上传了我的数据库

如果查询没有返回空值,那么就没有空值


您可以通过在EmployeeTraining.Training为NULL的位置添加
进行测试,如果该查询没有返回NULL,那么就没有NULL


您可以通过添加
WHERE EmployeeTraining进行测试。Training为NULL

您缺少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

缺少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

尝试使用不同的存在运算符进行理智测试,例如

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

如果此操作不返回任何值,则不存在缺失值。

请尝试使用其他存在运算符进行健全性测试,例如

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

如果此操作不返回任何值,则不会丢失任何值。

您需要在表:Employee和表:applicatabletraining之间执行交叉联接,然后使用视图: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 | |

在使用view:EmployeeTraining进行左连接之后,需要在table:Employee和table:applicatabletraining之间进行交叉连接

交叉连接,将表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 | |


我会留下这个作为评论,但是的,我同意。我用一些样本数据更新,我相信我在这里做错了什么。我会留下这个作为评论,但是的,我同意。我用一些样本数据更新,我相信我在这里做错了什么。添加一些样本表数据,和预期结果。显然,没有任何课程没有任何员工。一些员工参加了4/5的培训课程,并且在查询中有4条记录。Left Join不应该返回第五个培训课程,在“DateTake”和到期日中为空吗?您的查询应该可以按照您的问题中的方式工作,我刚刚尝试过。您是否从查询中删除了任何内容(如员工的WHERE子句)?您是否在ApplicatableTraining和EmployeeTraining之间定义了关系?ApplicatableTraining和EmployeeTraining(查询)具有一对多关系。EmployeeTraining查询基于我们的employee表和3个不同的培训表。添加一些示例表数据和预期结果。显然,没有任何课程没有任何员工。一些员工参加了4/5个培训课程,并且在查询中有4条记录。Left Join不应该返回第五个培训课程,在“DateTake”和到期日中为空吗?您的查询应该可以按照您的问题中的方式工作,我刚刚尝试过。您是否从查询中删除了任何内容(如员工的WHERE子句)?您是否在ApplicatableTraining和EmployeeTraining之间定义了关系?ApplicatableTraining和EmployeeTraining(查询)具有一对多关系。EmployeeTraining查询基于我们的employee表和3个不同的培训表。交叉联接与外部联接相同吗?它似乎不想识别交叉连接。它似乎可以识别外部连接,但我仍然无法获得所需的结果。我更新了我的答案。更多信息请参见:交叉连接与外部连接相同吗?它似乎不想识别交叉连接。它似乎可以识别外部连接,但我仍然无法获得所需的结果。我更新了我的答案。更多信息,请访问: