在MS-Access中交叉多个子查询(没有INTERSECT关键字)

Col*_*oss 3 sql ms-access vba access-vba ms-jet-ace

我需要在MS Access中交叉多个子查询.不幸的是,Access-SQL不支持INTERSECT关键字.我明白,我们如何使用两个表的INNER JOIN来获得我们想要的交集.但是,如何以编程方式创建将构成N个子查询交集的查询?

更具体一点:我有一份员工表和一份专业表.每个员工都可以拥有多个专业化,这意味着员工和专业化之间存在多对多关系,这些关系由包含员工和专业化ID的附加表所代表,并不复杂.

现在让我们说我想要一份员工清单,所有员工都在某处指定了所有专业.在任何其他SQL引擎中,我只需创建一个子查询列表,并使用INTERSECTION关键字将这些子查询"连接"在一起,创建类似于:

SELECT * FROM ( 
        (SELECT id, first_name, last_name FROM Employees JOIN Emp_spec 
            ON Employee.id = Emp_spec.spec_id WHERE Emp_spec.spec_id=x_1 )
        INTERSECT 
        ... 
        INTERSECT
        (SELECT id, first_name, last_name FROM Employees JOIN Emp_spec 
            ON Employee.id = Emp_spec.spec_id WHERE Emp_spec.spec_id=x_n )
);
Run Code Online (Sandbox Code Playgroud)

,其中x_1,...,x_n表示对应于某些特化的一些ID.此查询返回一组雇员,所有雇员都具有所有专业x_1,...,x_n.那么如何在没有INTERSECT关键字的Access中创建此类查询.我一直在尝试用INNER JOIN编写等效的查询,但我似乎无法成功.

Gor*_*son 6

也许这就是你的想法.对于测试表[员工] ......

id  first_name  last_name
--  ----------  ---------
 1  Gord        Thompson 
 2  Homer       Simpson  
 3  Hank        Kingsley 
Run Code Online (Sandbox Code Playgroud)

......和[Emp_spec] ......

emp_id  spec_id
------  -------
     1        1
     1        2
     2        1
     3        1
     3        2
Run Code Online (Sandbox Code Playgroud)

...查询

SELECT * FROM Employees
WHERE id IN (SELECT emp_id FROM Emp_spec WHERE spec_id=1)
    AND id IN (SELECT emp_id FROM Emp_spec WHERE spec_id=2)
Run Code Online (Sandbox Code Playgroud)

回报

id  first_name  last_name
--  ----------  ---------
 1  Gord        Thompson 
 3  Hank        Kingsley 
Run Code Online (Sandbox Code Playgroud)