2013-10-22 36 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