我是一个初学者,尝试使用基于此架构的表来学习和练习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
子句中子查询的组合
此子查询最多可以返回一条记录。
也许有人可以告诉我另一种计算方法?
由于我发现可以轻松快速地建立数据库和关系,因此正在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;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句