呼叫参数查询 - 访问SQL
问题描述:
我在MS Access表中持有人员的详细信息(tblStaff):呼叫参数查询 - 访问SQL
| 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解决方案。有人能指出我正确的方向吗?
(PS我并不要求任何人都可以编写查询对我来说,我只是想知道,如果有一个查询中通过从列中的值作为另一个查询参数的方式)
答
我设法找到了一个纯粹的SQL解决方案。我通过删除原始文章中qryDatedStaffList的日期条件开始。这给了我一个结构的每一个变化的清单(而不仅仅是那些对特定日期有效的变化)。
那么我可以简单地编写提交给它其中加入了stafflist自身另一个查询,并会显示任何记录,其中一位经理改变了区域,但他们报告的雇员(S)还没有更新:
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
当我使用历史数据创建任何形式的差异报告时,我经常使用一行临时表和一行日期 - 而不是将它们作为参数传递。它有助于简化非常复杂的查询。你可以试试。 –
嗨,谢尔盖。感谢您的回复。我不确定我完全理解你的意思。你的意思是运行特定日期的查询,然后将结果插入临时表中使用。然后对每个日期重复这个过程? – Leroy
您可以使用'TempVars'而不是参数。您可以通过VBA或通过宏设置它们,并在查询中引用它们。 –