我在编写SQL查询以搜索本周缺失的记录时遇到了麻烦。我正在使用access 2007.以下显示了我拥有的表格。
Employee Table
ID Name
1 JOhn
2 Peter
Time Cards
ID Name Date Week SO CardNUm
1 John 15/06/2015 21/06/2015 1234 1
2 Peter 16/06/2015 21/06/2015 1233 2
1 John 16/06/2015 21/06/2015 1231 3
1 John 17/06/2015 21/06/2015 1230 4
我设法使用以下sql查询搜索特定日期的缺失记录。
SELECT DISTINCT
Employee.Name
Employee.ID
FROM Employee
WHERE (((Employee.Name) Not In (
SELECT TC.Name
FROM [Time Card] AS TC
WHERE TC.Name = Employee.Name AND TC.Date = [Forms]![Missing Production Time Card]![Text12] )));
我正在尝试搜索所有记录,例如一周内的任何日子,例如2015年6月15日至2015年6月21日,对于没有输入时间卡的员工。 有什么方法可以修改我的查询或创建一个新查询,以便我得到以下结果?
上述时间卡表的结果应为
ID Name Date
1 John 18/06/2015
1 John 19/06/2015
1 John 20/06/2015
1 john 21/06/2015
2 Peter 15/06/2015
2 Peter 17/06/2015
2 Peter 18/06/2015
2 Peter 19/06/2015
2 Peter 20/06/2015
2 Peter 21/06/2015
答案 0 :(得分:0)
执行此操作的一种方法是创建临时表,并使用您要搜索的日期和员工填充该表。然后,您可以使用outer join
加入Time Card
表,并且临时表中Time Card
中没有匹配行的任何行都将丢失。
让另一个表格显示特定周的日期列表会很有用 - 这会使下面的代码更容易一些,并且还允许您处理银行假日和周末。
这是对代码的抨击:
CREATE TABLE ##missing (
Date datetime,
ID int
)
INSERT ##missing SELECT '20150605', ID FROM Employee
-- Repeat for other dates in the week, or use the table proposed above
SELECT
m.Date,
e.Name
FROM ##missing m
JOIN Employee e
ON m.ID = e.ID
LEFT OUTER JOIN [Time Card] tc
ON m.ID = tc.ID
AND m.Date = tc.Date
WHERE tc.ID IS NULL