【问题标题】:problem adding a where clause to a T-sql LEFT OUTER JOIN query向 T-sql LEFT OUTER JOIN 查询添加 where 子句的问题
【发布时间】:2010-05-17 11:03:12
【问题描述】:
SELECT TOP (100) PERCENT dbo.EmployeeInfo.id, MIN(dbo.EmployeeInfo.EmpNo) AS EmpNo, 
            SUM(dbo.LeaveApplications.DaysAuthorised) AS DaysTaken
FROM  dbo.EmployeeInfo LEFT OUTER JOIN dbo.LeaveApplications ON 
           dbo.EmployeeInfo.id = dbo.LeaveApplications.EmployeeID
WHERE (YEAR(dbo.LeaveApplications.ApplicationDate) = YEAR(GETDATE()))
GROUP BY dbo.EmployeeInfo.id, dbo.EmployeeMaster.EmpNo
ORDER BY DaysTaken DESC 

我想要的基本功能是检索表 dbo.EmployeeInfo 中的所有记录,而不管表 dbo.LeaveApplications 中是否存在相应的记录。如果 EmployeeInfo 中的一行在 LeaveApplications 中没有相关行,我想将其 SUM(dbo.LeaveApplications.DaysAuthorised) AS DaysTaken 列返回为 NULL,或者甚至可以设置为 0。

使用上面的查询,如果我删除 where 条件,就可以实现我想要的,但问题是我还想从 LeaveApplication 返回相关行,只有当 ApplicationDate 在当前年份时。

现在添加了 where 条件,只有当他们在 LeaveApplications 中有相应的行时才能从 EmployeeInfo 获取行,但我只想要 EmployeeInfo 中的所有行

【问题讨论】:

  • 如果没有对应的LeaveApplications,你想怎么办?返回行的 where 子句应该做什么?
  • 如果没有LeaveApplications,我还是想返回EmployeeInfo中的所有行,然后给dbo.LeaveApplications.DaysAuthorised查询结果列赋值NULL甚至0。
  • 也许我应该补充一点,即使 LeaveApplications 中有 0 个相关行,我仍然想检索 EmployeeInfo 中的所有记录,然后为每个返回的行的“DaysAuthorised”列显示 0(零) .

标签: sql-server-2005 tsql


【解决方案1】:

您可以在 WHERE 子句中添加对 NULL 的测试,这可能会导致您的 SUM 返回 NULL 以及 LeaveApplications 表中不存在的行:

SELECT TOP (100) PERCENT dbo.EmployeeInfo.id, MIN(dbo.EmployeeInfo.EmpNo) AS EmpNo, 
            SUM(dbo.LeaveApplications.DaysAuthorised) AS DaysTaken
FROM  dbo.EmployeeInfo LEFT OUTER JOIN dbo.LeaveApplications ON 
           dbo.EmployeeInfo.id = dbo.LeaveApplications.EmployeeID
WHERE (YEAR(dbo.LeaveApplications.ApplicationDate) = YEAR(GETDATE()))
      OR dbo.LeaveApplications.ApplicationDate IS NULL
GROUP BY dbo.EmployeeInfo.id, dbo.EmployeeMaster.EmpNo
ORDER BY DaysTaken DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2010-11-26
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多