SQL 用子查询解决?

SQL Solving with Subqueries?

我是初学者,正在尝试学习和练习 SQL 基于此架构的表格:

主键是 Employee.IDASSIGNMENT 显示了所有四列; ASSIGNMENT.ID 是对 EMPLOYEE.ID 的引用。开始和结束的域以年为单位。

问题: 我正在尝试编写一个查询,该查询将显示所有员工(按姓名)在他们完成后直接被分配到美国的任务在加拿大的任务。

这是我目前的尝试,计算失败。我相信我正朝着正确的方向前进,但存在语法错误。

SELECT 
    E.Name
FROM 
    EMPLOYEE E
INNER JOIN 
    ASSIGNMENT A ON E.ID = A.ID
WHERE 
    (SELECT End FROM ASSIGNMENT 
     WHERE Country = 'Canada') = (SELECT Start FROM ASSIGNMENT 
                                  WHERE COUNTRY = 'USA')
GROUP BY 
    E.Name;

欢迎任何有助于我理解我的误解的批评。我的错误来自 WHERE 子句

中子查询的组合

At most one record can be returned by this subquery.

也许有人可以告诉我另一种计算方法?

此查询正在 MS Access 中进行测试,因为我发现它很容易快速建立数据库和关系。

使用另一个连接代替子查询并向连接条件添加约束:

SELECT 
    E.Name
FROM 
    EMPLOYEE E
INNER JOIN 
    ASSIGNMENT A ON (     E.ID      = A.ID 
                      AND A.Country = 'Canada' )
INNER JOIN
    ASSIGNMENT B ON (     E.ID      = B.ID 
                      AND B.Country = 'USA'
                      AND B.Start   = A.End    )
GROUP BY 
    E.Name;

更新

OP 报告了一个来自 MS Access 的错误,抱怨上述版本的复合连接条件。但是,您可以安全地将内部连接条件移动到 where 子句。但是,临时结果集会增长,因为表的产品首先以较少的约束生成,然后进行过滤(一个好的查询优化器可能会避免不必要的记录生成,但我不知道 MS Access 在这方面的功能).

SELECT 
    E.Name
FROM 
    EMPLOYEE E
INNER JOIN 
    ASSIGNMENT A ON ( E.ID = A.ID )
INNER JOIN
    ASSIGNMENT B ON ( E.ID = B.ID )
WHERE
        A.Country = 'Canada'
    AND B.Country = 'USA'
    AND B.Start   = A.End
GROUP BY 
    E.Name;