sql - 如果添加 WHERE 子句,LEFT JOIN 不返回任何结果?

标签 sql sql-server t-sql

DECLARE @ps_StartDate DATETIME = '20190101'
      , @ps_EndDate   DATETIME = '20191224'
      , @ps_COMPANYNO VARCHAR(20) = '01'

SET @ps_EndDate = DATEADD(dd, 1, @ps_EndDate)

SELECT
    CASE WHEN @ps_COMPANYNO IN ('01') THEN 'YS45J146'
        ELSE 'YS45J147'
    END                                 AS 'Client ID'
    ,e.EMPNO                            AS 'WORKER ID'
    ,''                                 AS 'Org'
    ,''                                 AS 'Job Number'
    ,'Regular'                          AS 'Pay Component'
    ,''                                 AS 'Rate'
    ,''                                 AS 'Rate Number'
    ,SUM(t.TIMEBILLED + (ISNULL(ehrs.AllocationDays, 0) * 24))                  AS 'Hours'
    ,''                                 AS 'Units'
    ,''                                 AS 'Line Date'
    ,''                                 AS 'Amount'
    ,''                                 AS 'Check Seq Number'
    ,''                                 AS 'Override State'
    ,''                                 AS 'Override Local'
    ,''                                 AS 'Override Local Jurisdiction'
    ,''                                 AS 'Labor Assignment'
FROM TIMEBILL t (NOLOCK)
INNER JOIN EMPLOYEE e (NOLOCK) ON t.USERID = e.USERID
LEFT JOIN dbo.EmpHRSchedule ehrs (NOLOCK) ON (e.EmployeeNo = ehrs.EmployeeNo)
WHERE t.PRTID = 'P'
    AND t.DATE >= @ps_StartDate
    AND t.DATE < @ps_EndDate
    AND ehrs.STARTDATE >= @ps_StartDate
    AND ehrs.STARTDATE < @ps_EndDate
    AND e.COMPANYNO = @ps_COMPANYNO
    AND t.SUBCAT <> 'LUNCH'
    AND t.WAGETYPE <> 'OVERTIME'
    AND e.SALARYUNIT = 'HOURLY'
    --AND ehrs.Type = 'HOLIDAY'
GROUP BY e.EMPNO

仅当 dbo.EmpHRSchedule.Type = 'HOLIDAY' 条目存在时,我才尝试将其添加到“小时”列中。据我了解,LEFT JOIN 仅在匹配时才返回条目,对于不匹配则返回 NULL。当我取消注释 AND ehrs.Type = 'HOLIDAY' 行时,根本不返回任何结果。

为什么会出现这样的情况呢?我是否应该采用另一种方法来对 dbo.Timebill.Timebilled 和 dbo.EmpHRSchedule.AllocationDays 进行求和(如果存在)?

最佳答案

当您包括:

AND ehrs.Type = 'HOLIDAY'

WHERE 子句中,您实际上得到的是 INNER 连接,而不是 LEFT 连接,因为您只从表中获取匹配的行ers,而不是 ehrs.TypeNULL 的任何不匹配行。
您可以做的是将条件移至 LEFT 连接的 ON 子句:

LEFT JOIN dbo.EmpHRSchedule ehrs (NOLOCK) 
ON (e.EmployeeNo = ehrs.EmployeeNo) AND ehrs.Type = 'HOLIDAY' 

您还可以在同一个表中包含其他条件:

LEFT JOIN dbo.EmpHRSchedule ehrs (NOLOCK) 
ON (e.EmployeeNo = ehrs.EmployeeNo) AND ehrs.Type = 'HOLIDAY' 
   AND ehrs.STARTDATE >= @ps_StartDate
   AND ehrs.STARTDATE < @ps_EndDate

关于sql - 如果添加 WHERE 子句,LEFT JOIN 不返回任何结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59481393/

相关文章:

sql - 使用 xml.modify 或 SQL 中的其他方法更改元素名称

sql - 将分隔字符串传递给存储过程以搜索数据库

SQL:按日期顺序订购 Month_year

sql - 帮我完成这个 SQL 查询

mysql - 大数据从Oracle迁移到MySQL

sql-server - 对 xml 列执行 "insert only if node with specific value does not exist"的有效方法

mysql - 对平均函数进行 SQL 查询

mysql - 我怎样才能用SQL得到这两个郊区呢?

sql - 在 Select 查询中使用存储过程

mysql - 比较 MSSQL 中的表并获得不同的值