我缩短了我的查询和时间仅发布相关部分。有很多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.所以这个员工史蒂夫没有进入结果集。
答案 0 :(得分:1)
基本上,即使无法与某个类别匹配,您也只是要求您的员工退回。这很简单:这是LEFT JOIN
的用途。我没有理由将0
视为特别之处:根据您的描述,在我看来,您似乎也希望将其他任何不存在的值视为类别ID,它只是没有其他值。