【问题标题】:Left Join Won't Return Nulls?左连接不会返回空值?
【发布时间】:2016-09-30 12:43:51
【问题描述】:

我有一个查询和一个表。查询“EmployeeTraining”包括员工姓名、他们参加的培训课程、参加日期和到期日。我希望 LeftJoin 返回的是所有可用的培训课程和每个员工缺少的课程,所以从本质上讲,任何空值。

“ApplicableTraining”共有 5 条记录。有些员工只参加了 4/5 的课程,在“EmployeeTraining”记录中只有 4 条记录。 left join 不应该返回该特定员工的第 5 个培训项目,在“datetaken”和“Expiry”中为空?

示例适用培训:

  • WHMIS
  • 急救
  • 心肺复苏术
  • 丙烷
  • TDG

员工培训示例

  • 山姆 | WHMIS | 05/03/2011 |05/03/2012
  • 山姆 |急救 | 2010 年 6 月 9 日 | 2011 年 6 月 9 日
  • 山姆 |心肺复苏术 | 2011 年 5 月 3 日 | 2012 年 5 月 3 日
  • 山姆 |丙烷 | 2015 年 12 月 3 日| 2018 年 12 月 3 日

期望的结果

  • 山姆 | WHMIS | 05/03/2011 |05/03/2012
  • 山姆 |急救 | 2010 年 6 月 9 日 | 2011 年 6 月 9 日
  • 山姆 |心肺复苏术 | 2011 年 5 月 3 日 | 2012 年 5 月 3 日
  • 山姆 |丙烷 | 2015 年 12 月 3 日| 2018 年 12 月 3 日
  • 山姆 | TDG | |

这是通过 Access 上的设计视图生成的左连接,但它根本不返回任何空值。

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

【问题讨论】:

  • 添加一些示例表数据,以及预期的结果。
  • 显然没有没有员工的课程。
  • 部分员工参加了4/5培训课程,查询中有4条记录。 Left Join 不应该返回第 5 个培训课程,“DateTaken”和 Expiry 为空吗?
  • 您的查询应该与您的问题一样,我刚刚尝试过。您是否从查询中删除了任何内容(例如 Employee 上的 WHERE 子句)?您在 ApplicableTraining 和 EmployeeTraining 之间定义了关系吗?
  • applyTraining 和 EmployeeTraining (Query) 是一对多的关系。 EmployeTraining 查询基于我们的员工表和 3 个不同的培训表。

标签: sql ms-access left-join


【解决方案1】:

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

您可以添加WHERE EmployeeTraining.Training IS NULL进行测试

【讨论】:

  • 我会留下这个作为评论,但是我同意这个。
  • 我更新了一些示例数据,我相信我在这里做错了。
【解决方案2】:

您需要在 LEFT JOIN 和 view:EmployeeTraining 之后在 table:Employee 和 table:ApplicableTraining 之间进行 CROSS JOIN。

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

【讨论】:

  • 交叉连接和外连接一样吗?它似乎不想识别交叉连接。它似乎可以识别外部连接,但我仍然无法获得所需的结果。
  • 我更新了我的答案。查看更多信息:support.office.com/en-us/article/…
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    尝试使用不同的存在运算符进行健全性测试,例如

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

    如果这不返回任何内容,则没有缺失值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多