当值为0时,SQL INNER JOIN问题

时间:2018-01-31 05:39:59

标签: sql sql-server

我缩短了我的查询和时间仅发布相关部分。有很多INNER JOINS。这是查询: -

DECLARE 
    @startdate DATE = '2018-05-01',
    @enddate   DATE = '2018-05-05';
    WITH calendar
            AS (SELECT @startdate AS Dates
                UNION ALL
                SELECT Dateadd(dd, 1, Dates)
                FROM   calendar
                WHERE  Dates < @enddate)
    SELECT emp.Code, cv1.CategoryName AS Category FROM (
    SELECT *
    FROM   calendar c
            CROSS JOIN (SELECT DISTINCT Id
                        FROM   [dbo].[Employee] where CompanyId = 1) E
    WHERE  NOT EXISTS (SELECT 1
            FROM   [dbo].[ShiftSchedule] t
            WHERE  c.Dates = t.ShiftDate
            AND E.Id = t.EmployeeId AND CompanyId = 11)) AS c 
            INNER JOIN [dbo].[Employee] emp
            ON c.Id = emp.Id                
            INNER JOIN [dbo].[Category] cv1 
            ON cv1.id = emp.Category   
            AND emp.Id IN ( 400 )
    OPTION (maxrecursion 0)

此处的问题位于INNER JOIN的{​​{1}}。

在极少数情况下 - 在[dbo].[Category]表中找到类别0。所以我想要的是如果Category为0那么该记录也应该包含在结果集中。目前它以0跳过了记录。

可以在上面的查询中实现吗?

  

示例: - 在员工表中,我有一名员工Steve&amp;在类别中   列值为0.并且在列Id中的类别表中,没有   记录为0.所以这个员工史蒂夫没有进入结果集。

1 个答案:

答案 0 :(得分:1)

基本上,即使无法与某个类别匹配,您也只是要求您的员工退回。这很简单:这是LEFT JOIN的用途。我没有理由将0视为特别之处:根据您的描述,在我看来,您似乎也希望将其他任何不存在的值视为类别ID,它只是没有其他值。