【问题标题】:Left Join Doesn't Return Unmatched Rows As Null左连接不会将不匹配的行返回为空
【发布时间】:2014-06-30 05:52:49
【问题描述】:

在我的左表上,我将所有 EMP 信息与所有可能的资产联合起来,因此所有员工都被分配参加数据库中列出的所有课程。和正确的表我只有已经参加或正在参加课程的员工。(两个表都是查询并且它们的结果都是正确的)

我想在两个表(查询)之间进行左连接,所以我从左表联合右表中获取所有员工与新列(完成日期和完成状态)!

但是,当我进行左连接时,它会返回我的所有行并用完成状态的两种可能性填充空白,即已完成或正在进行中)。最愚蠢的事情发生在我添加完成日期并返回一些随机日期并填充完成日期的所有行并为以下资产标题重复这些行时。

我的结果应该是所有 EMP 联合与必修课程的列表,状态为当然,此人是否已完成课程,我希望所有那些不相关的行都为空。你会好心并检查我的代码并让我知道可能导致此问题的原因吗?谢谢

SELECT qryEmployeeCourse.[EMP ID], qryEmployeeCourse.Name, qryEmployeeCourse.Role, qryEmployeeCourse.Location, qryEmployeeCourse.Region, qryEmployeeCourse.[Asset ID], qryEmployeeCourse.[Asset Title], qryCourseStatus.[Completion Status]

FROM qryEmployeeCourse LEFT JOIN qryCourseStatus ON qryEmployeeCourse.[EMP ID] = qryCourseStatus.Username

GROUP BY qryEmployeeCourse.[EMP ID], qryEmployeeCourse.Name, qryEmployeeCourse.Role, qryEmployeeCourse.Location, qryEmployeeCourse.Region, qryEmployeeCourse.[Asset ID], qryEmployeeCourse.[Asset Title], qryCourseStatus.[Completion Status]
ORDER BY qryEmployeeCourse.Name, qryEmployeeCourse.Role, qryEmployeeCourse.Location;

http://i.stack.imgur.com/0zNVz.png 这是我的表格和结果的图片。

【问题讨论】:

  • 或许你只需要选择CompletionDate最新的记录
  • @Cha 不会有任何区别 :( 仍然像交叉连接一样
  • 如果它看起来是交叉连接,那么您连接的列不够多,或者您对数据基数的假设不正确。从您的屏幕截图和描述中很难判断哪个是您的问题,因为我无法弄清楚每个表上的独特约束是什么。为什么不发布每个源查询中的“Adebule”样本?

标签: sql ms-access ms-access-2007 ms-access-2010


【解决方案1】:

在我看来,您的 LEFT JOIN 应该是

qryCourseStatus ON qryEmployeeCourse.[EMP ID] = qryCourseStatus.Username AND qryEmployeeCourse.AssetID = qryCourseStatus.AssetID

否则,您将获得交叉联接(qryEmployeeCourse 中的所有行与 qryCourseStatus 中的所有行,对于每个员工)。

在屏幕截图的第一组结果中,您只得到两行,因为 qryCourseStatus 中的员工记录只有两个不同的状态 CompletedIn progress,并且您的分组依据正在删除所有其他重复项。

您会在第二组结果中获得更多行,因为您要添加 Completion Date,它具有该员工的 7 个不同值。

【讨论】:

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