呼叫参数查询 - 访问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我并不要求任何人都可以编写查询对我来说,我只是想知道,如果有一个查询中通过从列中的值作为另一个查询参数的方式)

+0

当我使用历史数据创建任何形式的差异报告时,我经常使用一行临时表和一行日期 - 而不是将它们作为参数传递。它有助于简化非常复杂的查询。你可以试试。 –

+0

嗨,谢尔盖。感谢您的回复。我不确定我完全理解你的意思。你的意思是运行特定日期的查询,然后将结果插入临时表中使用。然后对每个日期重复这个过程? – Leroy

+0

您可以使用'TempVars'而不是参数。您可以通过VBA或通过宏设置它们,并在查询中引用它们。 –

我设法找到了一个纯粹的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