从另一个查询调用参数查询-Access SQL
我在MS Access中有一个表,其中包含员工详细信息(tblStaff): 我每周用新数据刷新此表,如果有员工更换了经理,则将其与该记录的有效日期一起归档到另一个表(tblArchiveStaff)中从另一个查询调用参数查询-Access SQL,sql,ms-access,vba,Sql,Ms Access,Vba,我在MS Access中有一个表,其中包含员工详细信息(tblStaff): 我每周用新数据刷新此表,如果有员工更换了经理,则将其与该记录的有效日期一起归档到另一个表(tblArchiveStaff)中 | Employee ID | Employee Name | Manager ID| Manager Name | DateFrom| DateTo| -----------------------------------------------------------------------
| Employee ID | Employee Name | Manager ID| Manager Name | DateFrom| DateTo|
----------------------------------------------------------------------------
| 205442 | Carl Sagan | 235663 | Marie Curie |03/01/16|01/06/17|
我编写了一个参数查询(qryDatedStaffList),它将根据给定日期有效的记录从这些表中选择记录(SelectedDate
)
上面的查询工作正常
我现在正在尝试编写另一个查询,该查询将返回其经理保持不变但其第二线经理(经理的经理)已更改的所有员工。在这一点上,我被卡住了
我猜我需要在tblChanges中输入每条记录的DateTo值,作为上面qryDatedStaffList中的SelectedDate
参数,但不知道这是否可行
在最坏的情况下,我相信我可以用VBA实现这一点,但出于性能原因,我尝试使用纯SQL解决方案。有人能给我指出正确的方向吗
(p.s我不一定要求任何人为我编写查询,我只是想知道是否有方法将一个查询中的列中的值作为另一个查询中的参数传递)我确实找到了一个纯SQL解决方案。我首先在原始帖子中删除了qryDatedStaffList上的日期条件。这给了我一个结构每一次更改的列表(而不仅仅是那些在特定日期有效的更改) 然后,我可以简单地编写另一个查询来引用它,该查询将stafflist加入到自身中,并显示经理已更改区域但向其报告的员工未更新的任何记录:
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
当我使用历史数据创建任何类型的差异报告时,我通常使用一个临时表,其中一行的日期为到,而不是将它们作为参数传递。它有助于简化甚至非常复杂的查询。你可以试试。嗨,谢尔盖。谢谢你的回复。我不确定我是否完全理解你的意思。您的意思是运行特定日期的查询,然后将结果插入到临时表中进行处理。然后对每个日期重复此过程?可以使用
TempVars
而不是参数。您可以通过VBA或宏设置它们,并在querys.interest中引用它们。我以前从未遇到过临时变量。只是查找它们,它们看起来像一个全局变量?不完全确定如何将其应用于我的问题?tempvar
是可用于查询、宏和VBA的全局变量。语法是TempVars!MyVar
,例如在VBATempVars中!MyVar=10,然后在查询中,ID=TempVars!MyVar
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];
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