SQL 用子查询解决?
SQL Solving with Subqueries?
我是初学者,正在尝试学习和练习 SQL 基于此架构的表格:
EMPLOYEE
- ID, Name
ASSIGNMENT
- ID
, Country
, Start
, End
主键是 Employee.ID
,ASSIGNMENT
显示了所有四列; 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;
我是初学者,正在尝试学习和练习 SQL 基于此架构的表格:
EMPLOYEE
-ID, Name
ASSIGNMENT
-ID
,Country
,Start
,End
主键是 Employee.ID
,ASSIGNMENT
显示了所有四列; 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;