【发布时间】:2014-10-14 04:32:05
【问题描述】:
我需要在 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 )
);
,其中 x_1,...,x_n 表示对应于某些特化的一些 id。此查询返回一组员工,所有员工都具有所有特化 x_1,...,x_n。那么如何在没有 INTERSECT 关键字的 Access 中创建这样的查询。我一直在尝试使用 INNER JOIN 编写等效查询,但似乎无法成功。
【问题讨论】:
-
SELECT DISTINCT Employees.* FROM Employees INNER JOIN Emp_spec ON Employees.ID = Emp_spec.Employee_ID WHERE (((Emp_spec.Spec_ID) In (1,3)));
-
假设您的链接表同时具有 [Employee_ID] 和 [Spec_ID]。它还假设 [Spec_id] 存储为数字而不是文本。如果是文本,则需要用单引号括起来。
-
不,不是这样。您返回一组员工,其中每个员工至少有一个所需的专业。但是,我希望所有员工都拥有所有选定的专业。顺便说一句,您的选择与您在我上面的查询中使用 UNION 而不是 INTERSECT 执行相同的操作。
-
啊,我不明白结果必须拥有所有选择的专业。
SELECT DISTINCT Employees.* FROM (Employees INNER JOIN Emp_spec ON Employees.ID = Emp_spec.Employee_ID) INNER JOIN Emp_spec AS Emp_spec_1 ON Employees.ID = Emp_spec_1.Employee_ID WHERE (((Emp_spec.Spec_ID)=1) AND ((Emp_spec_1.Spec_ID)=3));在本例中,我们过滤 1 和 3。在查询设计网格中可视化要容易得多。诀窍是多次引入 Emp_Spec 表。每个标准一份。每个人都通过 ID 加入到 Employee 表中。 -
这些 cmets 正在参与其中。如果您要回答问题,则应发布答案而不是长评论。
标签: sql ms-access vba ms-jet-ace