我在MS Access中有一个表,其中包含员工详细信息(tblStaff):
| Employee ID | Employee Name | Manager ID | Manager Name |
--------------------------------------------------------------------
| 205147 | Bobby Fischer | 201154 | Alan Turing |
| 205442 | Carl Sagan | 204468 | Nikola Tesla |
我每周用新数据刷新此表,如果有任何员工更改了经理,那么它们将存档在另一个表(tblArchiveStaff)中,以及该记录有效的日期。
| Employee ID | Employee Name | Manager ID| Manager Name | DateFrom| DateTo|
----------------------------------------------------------------------------
| 205442 | Carl Sagan | 235663 | Marie Curie |03/01/16|01/06/17|
我编写了一个参数查询(qryDatedStaffList),它将从这些表中的任何一个表中选择记录,这些记录基于哪些表对于给定日期有效(SelectedDate
)
SELECT
tblUnion.[Employee ID],
tblUnion.[Manager Name],
tblUnion.DateFrom,
tblUnion.DateTo
FROM
(SELECT
ts.[Employee ID],
ts.[Manager Name],
DateAdd("d", 1, Nz(ta2.MaxDateTo, #01/02/16#)) AS DateFrom,
Date() AS DateTo
FROM
tblStaff ts
LEFT JOIN
(SELECT
[Employee ID],
max(DateTo) AS MaxDateTo
FROM
tblArchiveStaff
GROUP BY
[Employee Number]) ta2
ON ts.[Employee Number] = ta2.[Employee Number]
UNION ALL
SELECT
ta.[Employee ID],
ta.[Manager Name],
ta.DateFrom,
ta.DateTo
FROM
tblArchiveStaff ta) AS tblUnion
WHERE
SelectedDate Between [DateFrom] And [DateTo];
以上查询工作正常。
我现在正在尝试编写另一个查询,该查询将返回其经理保持不变但他们的第二直线经理(经理的经理)已发生变化的所有员工。此时我陷入困境。
我猜我需要输入tblChanges中每条记录的DateTo值作为上面qryDatedStaffList中的SelectedDate
参数,但不知道这是否可行?
最糟糕的情况是,我确信我可以通过VBA实现这一点,但出于性能原因,我正在尝试坚持使用纯SQL解决方案。有人能指出我正确的方向吗?
(p.s我不一定要求任何人为我编写查询,我只是想知道是否有办法将一个查询中的列传递一个值作为另一个查询中的参数)
答案 0 :(得分:1)
我确实找到了一个纯SQL解决方案。我开始删除原始帖子中qryDatedStaffList上的日期条件。这给了我一个结构的每个变化的列表(而不仅仅是那些在特定日期有效的变化)。
然后,我可以简单地编写另一个引用它的查询,该查询将人员列表加入到自身中,并显示任何记录,其中经理已更改区域但报告给他们的员工尚未更新:
SELECT *
FROM qryDatedStaffList AS a INNER JOIN qryDatedStaffList AS b ON a.[Employee ID] = b.[Manager ID]
WHERE a.dateto between b.datefrom and b.dateto-1