从另一个查询调用参数查询 - Access SQL

时间:2017-10-10 12:43:18

标签: sql ms-access access-vba

我在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我不一定要求任何人为我编写查询,我只是想知道是否有办法将一个查询中的列传递一个值作为另一个查询中的参数)

1 个答案:

答案 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