2013-10-22 29 views
1

数据库中的总EmpId = 74. 2013年9月在数据库中的活动日数= 22 我想要分离员工未填写MIS_Opus表中的生产日期。对于SQL Server中的LOOP

因为FULL OUTER Join没有工作,所以我使用了except查询。通过这个查询,我可以通过传递empid thru c#函数来获取每个员工的未填写日期。对于那个循环将返回到74#SQL &。请让我知道如何在SQL本身一次性获得所有员工的未填写日期。我使用SQL 2012和VS 2012 c#。

谢谢

select _Date from MIS_BM_Calendar c 
where c.Month = 'September 2013' and c.DayShiftStatus = 'active' 
except 
select _Date from MIS_Opus o 
where [email protected] 
+0

我们不在SQL中编写循环 - 我们尽量避免编写循环。 SQL(通常)是一种声明式的,基于集合的语言 - 您告诉系统整个结果集应该是什么样子,并且它是否使用循环,散列表等构建结果集。 –

回答

1

一种方式是建立使用cross join全体员工+天组合的列表。然后,您可以使用left join来检查当天是否有员工条目。

select days._Date as TheDay 
,  emps.EmpId as EmployeeWithMissingEntry 
from (
     select distinct _Date 
     from MIS_BM_Calendar 
     where Month = 'September 2013' 
       and DayShiftStatus = 'active' 
     ) days 
cross join -- One row for each combination of employee and date 
     (
     select distinct EmpId 
     from MIS_Opus 
     ) emps 
left join 
     MIS_Opus o 
on  o._Date = days._Date 
     and o.EmpId = emps.EmpId 
where o._Date is null -- Employee entry for day not found 
+0

非常感谢Andomar。这个查询向我展示了如何以编程方式思考的非常不同的态度。 – Aruna